Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.
Example:
Input: "babad"
Output: "bab"
Note: "aba" is also a valid answer.
Example:
Input: "cbbd"
Output: "bb"
题目分析:返回一个字符串的最长回文子串。首先明确一下回文串的概念。一个回文串也就是一个字符串,它从正着读和反着读都是一样的。例如"aba"就是一个回文串,"abba"也是回文串,而"abc"则不是。
本题最简单的想法就是设置两个指针i,j,然后依次判断i,j位置之中的字符串是否为回文串,这种方法的时间复杂度为0(n^2),且有大量的不必要判断。
我们还是考虑一次遍历的情况,设置一个指针i,来寻找从i位置往两边扩展能扩的最大回文子串长度,一次遍历下来就可以得到答案。但是这时候有个问题,回文串有可能是奇串也有可能是偶串,如果我们分奇偶来考虑则会很麻烦。能否将两种情况合并成一种呢?我们定义函数findLongestPalidrome(String s, int i, int j),其中i,j为开始搜索时的起始位置,那么如果为奇数的情况下令i=j问题就引刃而解了,而偶数情况下我们令j=i+1,查找de终止条件为i,j越界或者s.charAt(i)!=s.charAt(j)。此时我们可以得到最长的回文子串的开始位置和结束位置,用两个变量记录下来。然后每一次循环之后进行比较即可。这种情况的复杂度仍为O(n^2),但是中间的判断步骤会少很多。可以近似达到O(n)。
int start = 0;
int len = 1;
public String longestPalindrome(String s) {
if (s == null)
return null;
if (s.length() == 1)
return s;
for (int i = 0; i < s.length(); i++) {
findLongestPalidrome(s, i, i);
findLongestPalidrome(s, i, i + 1);
}
return s.substring(start, start + len);
}
private void findLongestPalidrome(String s, int i, int j) {
while (i >= 0 && j < s.length() && s.charAt(i) == s.charAt(j)) {
i--;
j++;
}
if (j - i - 1 > len) { //易错,容易写成j-i+1
len = j - i - 1;
start = i + 1;
}
}
网友评论