leetcode_5_LongestPalindromicSubstring

来源:互联网 发布:个人博客用什么域名好 编辑:程序博客网 时间:2024/05/16 08:12


寻找字符串中的最大回文串.

思路:

1.从前往后遍历,找到最前最后相同的字符;

2.判断这个子串是否比之前的回文串长;

3.比之前的回文串长则继续判断该子串是否为回文串;

4.是回文串则记录下来;

5.以上是判断回文串大于2的情况,当回文串没有超过1的情况,另做讨论.


优化:

1.循环中后面剩余的字符串小于当前的最大回文串,则停止不需要继续向后判断;

2.判断回文串的过程另外封装成函数;

3.去掉midRight.


#include <iostream>
#include <string.h>

using namespace std;

class Solution
{
public:
string longestPalindrome(string s);
};


string Solution::longestPalindrome(string s) {
string longP;


int n = s.length();
int subLen = 0;
for (int i = 0; i < n; i++)
{
for (int j = n - 1; j > i; j--)
{
if (s[i] == s[j]&& j - i + 1>subLen)
{
    int sum = i + j;
int midLeft,midRight;
if (sum % 2 == 0)
{
midLeft = midRight = sum / 2;
}
else
{
midLeft = sum / 2;
midRight = midLeft + 1;
}

bool flag = true;
for (int k=0;k+i<=midLeft;k++)
{
if (s[i + k] != s[j - k])
{
flag = false;
break;
}
}
if (flag)
{
subLen = j - i + 1;
longP = s.substr(i,subLen);
}
}
}
}
if (subLen == 0)
{
subLen = 1;
longP = s[0];
}
return longP;
}


int main()
{
string str = "eabcb";
Solution SS;
string subStr = SS.longestPalindrome(str);

cout << subStr.c_str() << endl;
return 0;
}