测试用例:
“abbcdedc”
人家写的两种解法:
**
1. 中心扩散
**
核心:
遍历字符串中每个元素,以他为中心找到左右对称的最长子串。
注意:
在找该子串的时候又分两种情况:
偶数:bccb算一种,此时两边对称
奇数:bcb算一种,此时中心对称
代码如下:
string longestPalindrome(string s)
{
string res="",tmp;
for(int i=0;i<s.size();i++)
{
string s1=centerS(s,i,i); //centerS函数返回以i为中心的最长的回文字符串
string s2=centerS(s,i,i+1); //两种情况!
if(s1.size()>s2.size())
tmp=s1;
else
tmp=s2;
res=res.size()>tmp.size()?res:tmp;
}
return res;
}
核心代码如下:
string centerS(string s,int left,int right)
{
while(left>=0&&right<s.size())
{
if(s[left]!=s[right])
break;
left--;
right++;
} // 如果满足左右对称,则继续扩展
string res=s.substr(left+1,right-left-1);
return res;
}
2. 动态规划
**
核心:建立一个二位数组记录“i为起始点,j为终止点”的字符串是否为回文字符串;是为1,不是为0;
如果cbc是回文字符串,则acbca也是
如果[3,5]为1且S[2]==S[6]的话,则[2,6]也为1,称为状态转移
**
class Solution {
public:
string longestPalindrome(string s) {
int len=s.size();
if(len==0||len==1)
return s;
int start=0;//回文串起始位置
int max=1;//回文串最大长度
vector<vector<int>> dp(len,vector<int>(len));//定义二维动态数组
for(int i=0;i<len;i++)//初始化状态
{
dp[i][i]=1;
if(i<len-1&&s[i]==s[i+1])
{
dp[i][i+1]=1;
max=2;
start=i;
}
}
for(int l=3;l<=len;l++)//l表示检索的子串长度,等于3表示先检索长度为3的子串
{
for(int i=0;i+l-1<len;i++)
{
int j=l+i-1;//终止字符位置
if(s[i]==s[j]&&dp[i+1][j-1]==1)//状态转移
{
dp[i][j]=1;
start=i;
max=l;
}
}
}
return s.substr(start,max);//获取最长回文子串
}
};
以上动态规划代码作者:gpe3DBjDS1
链接:https://leetcode-cn.com/problems/two-sum/solution/zui-chang-hui-wen-zi-chuan-c-by-gpe3dbjds1/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。