一、题目
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:
输入: "cbbd"
输出: "bb"
二、思路
1、字符串s长度为l,
2、长度为1的字符串全是回文子串
3、长度为2,并且两个字符相同的为回文子串
4、长度为3的字串当s[0]==s[2],则为回文子串
5、长度为4的字串当s[0]==s[3]&&s[1]s[2]s[3]是回文子串
3、由此依次类推得出最长回文子串
三、程序
#include<iostream>
#include<string>
#include<vector>
using namespace std;
string longestPalindrome(string s)
{
int m_iSlength = s.length();
int m_iStart = 0;//最大回文子串的开始位
int m_iEndLength = 0;//最大回文子串的长度
string m_strDest = "";//最大回文子串
string m_strSrctmp = "";
if (0 == m_iSlength || 1 == m_iSlength)
{
return s;
}
vector<vector<int>> m_vecS(m_iSlength, vector<int>(m_iSlength));
for (int i = 0; i < m_iSlength; i++)
{
m_vecS[i][i] = 1;//长度为1的是回文子串
if ((i < m_iSlength - 1) && (s[i] == s[i + 1]))
{
m_vecS[i][i+1] = 1;长度为2的是回文子串
m_iStart = i;//两位是s[i]s[i+1],所以开始就是i
m_iEndLength = 2;//长度就是2
}
}
for (int j = 3; j <= m_iSlength; j++)//j是子字符串长度,从3开始
{
for (int k = 0; j+k-1 < m_iSlength; k++)//k是在j基础上s字符串上移动的坐标:计算所有长度为j的子字符串
{
if (s[k] == s[j + k - 1] && m_vecS[k + 1][j + k - 2])//k是子字符串长度为j的第0位
{
m_iStart = k;//k是长度为j的子字符串开始位
m_iEndLength = j;
m_vecS[k][j + k - 1] = 1;
}
}
}
m_strDest = s.substr(m_iStart, m_iEndLength);//截取最终结果
return m_strDest;
}
int main()
{
cout << longestPalindrome("abacaba")<<endl;
system("pause");
return 0;
}
四、总结
1、二维vector数组
vector<vector<int>> m_vecstrS(len,vector<int>(len));