题目:Longest Palindromic Substring 最长的回文子串
难度:中等
Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.
Example 1:
Input: "babad"
Output: "bab"
Note: "aba" is also a valid answer.
Example 2:
Input: "cbbd"
Output: "bb"
题意解析:给定一个字符串s,在s中找出最长的回文子字符串。假设s的最大长度为1000。
回文:正反都一样的字符串,从左到右和从右到左相等
解题思路一:
从左边到右边依次遍历,以每一个元素作为回文字符串的中心点,将其向左右两边同时扩展,若左边等于右边,则到目前扩散的位置的字符串是回文,记录下此时的字符串,直至左边不等于右边,或者到达了字符串的边界位置,这是回文字符是奇数个的情况,若是偶数,则以当前元素和它的下一个元素为基点,向两侧进行扩散。其源代码如下。
public String longestPalindrome(String s) {
if (s == null || s.length() < 1) return "";
int len = s.length();
int start = 0,max = 0, end = 0;
for (int i = 0; i < len; i++) {
int j = i - 1, k = i + 1;
while (j >= 0 && k < len && s.charAt(j) == s.charAt(k)){
if (k - j + 1 > max){
start = j;
max = k - j + 1;
end = k;
}
j--;
k++;
}
}
for (int i = 0; i < len; i++) {
int j = i, k = i + 1;
while (j >= 0 && k < len && s.charAt(j) == s.charAt(k)){
if (k - j + 1 > max){
start = j;
max = k - j + 1;
end = k;
}
j--;
k++;
}
}
return s.substring(start, end+1);
}
此算法内层进行两次变量,时间复杂度为O(2n²),去掉常数时间复杂度为O(n²)
提交代码之后:
Runtime: 24 ms, faster than 56.56% of Java online submissions for Longest Palindromic Substring.
Memory Usage: 37.7 MB, less than 87.97% of Java online submissions for Longest Palindromic Substring.
解题思路二:
在上一中方法中,奇偶不同时写了两遍的判断代码,其实我们完全可以将其合并到一起,写一次就行了,奇偶唯一不同的就是最中间的时候多一个数,当个数为奇数时,我们完全可以让当前元素与自己比较,然后再扩散,这样就只需写一次代码就够了。其源代码如下。
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;
}
此算法比上面的稍微优化了一点,时间复杂度还是O(n²)
提交代码之后:
Runtime: 9 ms, faster than 90.79% of Java online submissions for Longest Palindromic Substring.
Memory Usage: 37.8 MB, less than 83.26% of Java online submissions for Longest Palindromic Substring.
效率较上面提升了一大截