题目
给定一个字符串s
,找到s
中最长的回文子串。你可以假设 s
的最大长度为 1000。
思路
动态规划
P(i,j) = (P(i+1,j-1) and Si == Sj)
代码
ps:注意这里外面的for用的是长度,直接下标i循环也是可以的
class Solution {
public String longestPalindrome(String s) {
int str_len = s.length();
boolean[][] sign = new boolean[str_len][str_len];
String res = "";
for(int length = 1;length <= str_len;length++){
for(int start = 0;start < str_len;start++){
int end = start + length - 1;
if(end >= str_len) break;
if(length == 1){
sign[start][end] = true;
}
else if(length == 2){
if(s.charAt(start) == s.charAt(end))sign[start][end] = true;
}
else{
if(s.charAt(start) == s.charAt(end) && sign[start+1][end-1]){
sign[start][end] = true;
}
}
if(sign[start][end] == true)res = s.substring(start,end+1);
}
}
return res;
}
}
马拉车算法
class Solution {
public String longestPalindrome(String s) {
String tString = "$#";
for(int i = 0;i < s.length();i++){
tString += s.charAt(i);
tString += "#";
}
int[] p = new int[tString.length()];
int mx = 0, id = 0,resLen = 0,resCenter = 0;
for(int i = 1;i < tString.length();i++){
p[i] = mx > i ? Math.min(p[2*id - i], mx - i):1;
while(i+p[i] < tString.length()&&i-p[i] >= 0&& tString.charAt(i + p[i]) == tString.charAt(i - p[i]))++p[i];
if(mx < i + p[i]){
mx = i + p[i];
id = i;
}
if(resLen < p[i]){
resLen = p[i];
resCenter = i;
}
}
return s.substring((resCenter - resLen)/2,(resCenter - resLen)/2 + resLen - 1);
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。