标签:++ 连续字符串 start val pos 中心 子串 reverse sub
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:
输入: "cbbd"
输出: "bb"
解:这题我首先颠倒以下,用的最长公共子串的方法,发现有些情况下是错的,如aabfgbaa,这样求出来的回文串是错的
所以加一个判断条件,当颠倒后的字符下标 加上当前连续字符串的长度,等于当前正序的字符时,再改变最长子串的长度
class Solution { public: string longestPalindrome(string s) { int n =s.size(); vector<vector<int>> vec(n+1,vector(n+1,0)); int max_value=0; int start_pos=0; string s_rev=s; reverse(s_rev.begin(), s_rev.end()); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(s[i-1]==s_rev[j-1]) { vec[i][j]=vec[i-1][j-1]+1; if(vec[i][j]>max_value) { //判断每个子回文串位置是否相等 int init_pos=n-(j-1)-1; if(init_pos+vec[i][j]==i) { max_value=vec[i][j]; start_pos=i-max_value; } } } } } return s.substr(start_pos,max_value); } };
中心扩散法和另外的动态规划尝试坐下
标签:++ 连续字符串 start val pos 中心 子串 reverse sub
原文地址:https://www.cnblogs.com/wangshaowei/p/12312872.html