20.8.19 求最长回文子串(动态规划、中心扩散)求回文子串的个数 to_string

1.求最长回文子串

使用动态规划
状态:如果s[i+1]…s[j-1]是回文串,而且s[i]=s[j],那么s[i]…s[j]也是回文串
所以状态转移数组dp[i] [j]表示s[i…j]是否是一个回文串

class Solution {
public:
    string longestPalindrome(string s) {
        if(s.size()<=1) return s;
        bool dp[s.size()][s.size()];//dp数组
        int maxlen=1;
        int start=0;
        
        for(int j=1;j<s.size();j++){
            for(int i=0;i<j;i++){//从s[0..1]开始
                if(s[i]!=s[j]) dp[i][j]=false;
                else if(j-i<3||dp[i+1][j-1]) dp[i][j]=true;
                //j-i<3的意思是,如果s[i]=s[j]而且i和j之间只有0个或1个字符,那么s[i..j]是回文串
                else dp[i][j]=false;
                
                if(dp[i][j]&&j-i+1>maxlen){
                    maxlen=j-i+1;
                    start=i;
                }
            }
        }
        return s.substr(start,maxlen);
    }
};

使用中心扩散法
枚举每一个字符作为中心点,用双指针向两边扩散,来搜索到以该字符为中心的最长回文串

    string centerSpread(string s, int left, int right) {
        int size = s.size();
        int i = left;
        int j = right;//左右起点,应枚举所有i=j和j=i+1的情况,来对应最终是奇数还是偶数
        while (i >= 0 && j < size) {
            if (s[i] == s[j]) {
            	i--;j++;
            } else {
                break;
            }
        }
        return s.substr(i + 1, j - i - 1);
    }

2.求回文子串的个数

使用上面的中心扩散法,每成功扩散一次,则找到一个回文子串

class Solution {
public:
    int countSubstrings(string s) {
        if(s.size()<=1) return s.size();
        int ans=0;
        int len=s.size();
        int l,r;
        for(int i=0;i<len;i++){
            for(int j=i;j<=i+1;j++){
                l=i;
                r=j;
                while(l>=0&&r<len&&s[l--]==s[r++]) ans++;
            }
        }
        return ans;
    }
};

3.to_string

std::to_string
在这里插入图片描述

vector<int> nums={1,2,3,4,5};
 vector<string> numstring;
        for(auto x:nums)
            numstring.push_back(to_string(x));
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值