题目链接:
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindromic-substring
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。
示例 2:
输入: “cbbd”
输出: “bb”
中心扩散方法
从中心向两端寻找,最终得到最大的字符串
c++
class Solution {
public:
/*返回比对成功个数*/
inline int findMaxString(const string s, const int iLeft, const int iRight)
{
int iTmp = 0;
int iLeftTmp = iLeft;
int iRightTmp = iRight;
while(iLeftTmp >= 0 &&
iRightTmp < s.length() &&
s[iLeftTmp] == s[iRightTmp])
{
iTmp++;
iLeftTmp --;
iRightTmp ++;
}
return iTmp;
}
string longestPalindrome(string s) {
int iNum = 0;
int iLeft = 0;
int iRight = 0;
int iTmp = 0;
int iLenNum = 0;
int iMaxlen = 0;
if(s.empty() || 1 == s.length())
{
return s;
}
iMaxlen = 1;
for (iNum = 0; iNum < s.length(); iNum++)
{
/*尝试双数最大,如为回文,则长度为 2 * iTmp */
iTmp = Solution::findMaxString(s, iNum, iNum+1);
if( iTmp > 0 &&
0 != (iLenNum = (iTmp + iTmp)) &&
iLenNum > iMaxlen)
{
iLeft = iNum - (iTmp - 1);
//iRight = iNum + 1 + (iTmp - 1);
iMaxlen = iLenNum;
}
/*找单数最大,如为回文,则长度为 2 * iTmp + 1 */
iTmp = Solution::findMaxString(s, iNum - 1, iNum + 1);
if( iTmp &&
0 != (iLenNum = (iTmp + iTmp + 1)) &&
iLenNum > iMaxlen)
{
iLeft = iNum - iTmp;
//iRight = iNum + iTmp;
iMaxlen = iLenNum;
}
}
return s.substr(iLeft,iMaxlen);
}
};
执行结果
实际效果并不是很优秀。
参考一下优秀的
动态规划思想
class Solution {
public:
string longestPalindrome(string s)
{
int left = 0;
int right = 0;
int nextPos = 0;
int startPos = left;
int maxLength = 1;
int len = s.length();
if (len == 1)
{
return s;
}
while (nextPos < len)
{
left = right = nextPos;
while (right + 1 < len && s[right] == s[right + 1])
{
++right;
}
nextPos = right + 1;
while (left > 0 && right < len - 1 && s[left - 1] == s[right + 1])
{
--left;
++right;
}
if (right - left + 1 > maxLength)
{
startPos = left;
maxLength = right - left + 1;
}
}
return s.substr(startPos, maxLength);
}
};
耗时和内存消耗很优秀啊,带来的效果确实极大的,还要努力啊!
附带一个调试的main函数
供测试验证使用
int main(const int argc, const char * argv[])
{
class Solution solution;
if(argc < 2)
{
std::cout << "parameter error" << std::endl;
return -1;
}
string s = argv[1];
std::cout << solution.longestPalindrome(s) << std::endl;
return 0;
}