求最大回文子串。回文子串即为对称的字符串。
本能笨思路:遍历所有元素当作中心元素,左右移位判断是否相等。注意边界问题,还有就是按照是否有中心元素分为两种情况。
代码如下,理所当然没通过。。vs下自己测试了一些应该算法应该没问题。
class Solution(object):
def longestPalindrome(self,s):
maxlen=0
if len(s)==1:
return 1
else:
if s[0]==s[1] or s[-1]==s[-2]:
maxlen=2
for i in range(1,len(s)-1):
j=0
while(i-j >=1 and i+1+j <=len(s)-2 and s[i-j]==s[i+1+j]):
j+=1
maxlen=max(maxlen,j*2)
j=0
while(i-j-1 >=1 and i+1+j <len(s)-2 and s[i-1-j]==s[i+1+j]):
j+=1
maxlen=max(maxlen,j*2+1)
return maxlen
同样的思路,cpp代码通过。
class Solution {
public:
string longestPalindrome(string s) {
const int len = s.size();
if(len <= 1)return s;
int start, maxLen = 0;
for(int i = 1; i < len; i++)
{
//寻找以i-1,i为中点偶数长度的回文
int low = i-1, high = i;
while(low >= 0 && high < len && s[low] == s[high])
{
low--;
high++;
}
if(high - low - 1 > maxLen)
{
maxLen = high - low -1;
start = low + 1;
}
//寻找以i为中心的奇数长度的回文
low = i- 1; high = i + 1;
while(low >= 0 && high < len && s[low] == s[high])
{
low--;
high++;
}
if(high - low - 1 > maxLen)
{
maxLen = high - low -1;
start = low + 1;
}
}
return s.substr(start, maxLen);
}
};
还看到manacher算法和后缀数组什么的,原谅我的懒惰。。