最长回文子串
方法一:将字符串逆序,找原字符串和逆序字符串的最长公共子串
漏洞:可能源字符串中存在对称的子串
解决:检查索引值
方法二:暴力
方法三:动态规划
先从一两个字母的回文开始,向两边增加对称字母
方法四:从串中心延伸 java代码:
public String longestPalindrome(String s) {
if (s == null || s.length() < 1) return "";
int start = 0, end = 0;
for (int i = 0; i < s.length(); i++) {
int len1 = expandAroundCenter(s, i, i);//中间字母是一个
int len2 = expandAroundCenter(s, i, i + 1);//中间字母是两个一样的
int len = Math.max(len1, len2);
if (len > end - start) {
start = i - (len - 1) / 2;
end = i + len / 2;
}
}
return s.substring(start, end + 1);
}
private int expandAroundCenter(String s, int left, int right) {
int L = left, R = right;
while (L >= 0 && R < s.length() && s.charAt(L) == s.charAt(R)) {
L--;
R++;
}
return R - L - 1;
}
Complexity Analysis
-
Time complexity : O(n^2). Since expanding a palindrome around its center could take O(n) time, the overall complexity is O(n^2).
-
Space complexity : O(1).
python代码:
class Solution:
def longestPalindrome(self, s: 'str') -> 'str':
start=end=0
length=len(s)
for i in range(length):
len1=self.expandAroundCenter(s,i,i)
len2=self.expandAroundCenter(s,i,i+1)
maxlen=max(len1,len2)#不要把名字起成len
if maxlen>end-start:
start=i-(maxlen-1)//2
end=i+maxlen//2
#print(s[start:end+1])
return s[start:end+1]#注意不是s[start,end+1]
def expandAroundCenter(self, s:'str', left:'int', right:'int')->'int':
L=left
R=right
while L>=0 and R<len(s) and s[L]==s[R]:
L-=1
R+=1
return R-L-1
solu=Solution()
print(solu.longestPalindrome('abcbe'))
方法五:Manacher's Algorithm(难)
O(n)效率
介绍该算法的链接:
https://cp-algorithms.com/string/manacher.html
以后再详细看咯