string经典题目(C++)

文章目录


前言

一、最长回文子串

1.题目解析

给你一个字符串 s,找到 s 中最长的回文子串。

示例 1:

输入:s = "babad"

输出:"bab"

解释:"aba" 同样是符合题意的答案。

示例 2:

输入:s = "cbbd"

输出:"bb"

提示:

1 <= s.length <= 1000

s 仅由数字和英文字母组成

2.算法原理

中心扩展算法

回文串有这样一个特点,从中间劈开,两边对称。

固定一个中心点,从中心点开始,向两边扩展。

奇数长度和偶数长度都需要考虑。

3.代码编写

cpp 复制代码
class Solution {
public:
    string longestPalindrome(string s) 
    {
        //中心扩展算法
        int begin=0;
        int len=0;
        int n=s.size();
        for(int i=0;i<n;i++)
        {
            int left=i;
            int right=i;
            //奇数长度
            while(left>=0&&right<=n-1&&s[left]==s[right])
            {
                left--;
                right++;
            }
            if(right-left-1>len)
            {
                begin=left+1;
                len=right-left-1;
            }
            //偶数
            left=i;
            right=i+1;
            while(left>=0&&right<=n-1&&s[left]==s[right])
            {
                left--;
                right++;
            }
            if(right-left-1>len)
            {
                begin=left+1;
                len=right-left-1;
            }

        }
        return s.substr(begin,len);
    }
};

二、字符串相乘

1.题目解析

43. 字符串相乘

2.算法原理

我们可以按照正常加减法进行进位计算,但是会很麻烦,

无进位相乘然后相加,最后处理进位。

我们需要对两个数组进行逆序。

同时处理前导0的场景。

我们利用一个数组进行存储,二者相乘结果正好可以放在下标相加的位置。

3.代码编写

cpp 复制代码
class Solution {
public:
    string multiply(string num1, string num2) 
    {
        int m=num1.size();
        int n=num2.size();
        //两个字符串逆序
        reverse(num1.begin(),num1.end());
        reverse(num2.begin(),num2.end());
        //数组存储
        vector<int>v(m+n-1);

        //无进位相乘并相加
        for(int i=0;i<m;i++)
        {
            for(int j=0;j<n;j++)
            {
                //转化成数字
                v[i+j]+=(num1[i]-'0')*(num2[j]-'0');
                
            }
        }
        //处理进位
        int cur=0;//遍历v
        int t=0;//记录进位
        string ret;
        //可能单独进位
        while(cur<m+n-1||t)
        {
            if(cur<m+n-1) t+=v[cur++];
            ret+=t%10+'0';
            t/=10;
        }
        
        //处理前导0
        while(ret.size()>1&&ret.back()=='0') ret.pop_back();

        reverse(ret.begin(),ret.end());
        return ret;
    }
};

总结

以上就是今天要讲的内容 。希望对大家的学习有所帮助,仅供参考 如有错误请大佬指点我会尽快去改正 欢迎大家来评论~~ 😘 😘 😘

相关推荐
梦星辰.44 分钟前
VSCode CUDA C++进行Linux远程开发
linux·c++·vscode
知之则吱吱1 小时前
亚马逊AWS云服务器高效使用指南:最大限度降低成本的实战策略
服务器·云计算·aws
远方16091 小时前
0x-2-Oracle Linux 9上安装JDK配置环境变量
java·linux·oracle
cui_win1 小时前
每日一令:Linux 极简通关指南 - 汇总
linux·运维·服务器
知星小度S1 小时前
Linux权限探秘:驾驭权限模型,筑牢系统安全
linux·运维·服务器
黄交大彭于晏2 小时前
发送文件脚本源码版本
java·linux·windows
搞Linux的杰仔2 小时前
Ubuntu20.04基础配置安装——系统安装(一)
linux·嵌入式开发
Kaede64 小时前
如何应对Linux云服务器磁盘空间不足的情况
linux·运维·服务器
Zfox_6 小时前
Redis:Hash数据类型
服务器·数据库·redis·缓存·微服务·哈希算法
Kookoos7 小时前
Dynamics 365 Finance + Power Automate 自动化凭证审核
运维·自动化·dynamics 365·power automate