题目如下:
Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.
解题思路:
本题与判断回文还有一些区别,找出一个字符串中最长的回文,所以在复杂度上要比纯碎的找回文要高。
思路1:通过对存在回文的奇偶性分别进行查找。
提交代码:
private int loc, maxLen;
public String longestPalindrome(String s) {
int len = s.length();
if (len < 2)
return s;
for (int i = 0; i < len-1; i++) {
extendPalindrome(s, i, i); //assume odd length, try to extend Palindrome as possible
extendPalindrome(s, i, i+1); //assume even length.
}
return s.substring(loc, loc + maxLen);
}
private void extendPalindrome(String s, int j, int k) {
while (j >= 0 && k < s.length() && s.charAt(j) == s.charAt(k)) {
j--;
k++;
}
if (maxLen < k - j - 1) {
loc = j + 1;
maxLen = k - j - 1;
}
}
思路1:使用动态规划的思想,如果该串是回文,其子串(去除第一个和最后一个字符后的串)也是回文。具体的代码如下:
int n = s.length();
String res = null;
boolean[][] dp = new boolean[n][n];
for (int i = n - 1; i >= 0; i--) {
for (int j = i; j < n; j++) {
dp[i][j] = s.charAt(i) == s.charAt(j) && (j - i < 3 || dp[i + 1][j - 1]);
if (dp[i][j] && (res == null || (j - i + 1) > res.length())) {
res = s.substring(i, j + 1); //substring
}
}
}
return res;
}
经过提交这两个代码,动态规划的方法效率略低,具体原因就不分析了。