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;
    }
};

总结

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

相关推荐
咏颜9 分钟前
Ubuntu离线安装Docker容器
linux·运维·服务器·经验分享·ubuntu·docker
☆凡尘清心☆16 分钟前
CentOS上安装NTP并配置时间同步
linux·阿里云·centos
KevinRay_1 小时前
Linux系统编程深度解析:C语言实战指南
linux·c语言·mfc·gdb
DexterLien1 小时前
Debian 12 安装配置 fail2ban 保护 SSH 访问
运维·debian·ssh·fail2ban
爱学习的白杨树1 小时前
什么是MVCC?
java·服务器·数据库
娶不到胡一菲的汪大东1 小时前
Shell脚本
linux·运维·ubuntu
xserver22 小时前
ensp 基于静态NAT发布公司网站服务器,
运维·服务器
QYpiying2 小时前
服务器中了挖矿病毒-应急响应
运维·服务器
[T]2 小时前
Linux自动挂载与卸载USB设备
linux
上海运维Q先生2 小时前
面试题整理14----kube-proxy有什么作用
运维·面试·kubernetes