Longest Palindromic Substring
题目来源:https://leetcode.com/problems/
-问题描述-
-解题思路-
-代码实现-
问题描述
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”
解题思路
思路1
(1)确定最长子字符串的左右边界l, r;
(2)循环判断s[l–]==s[r–] ;
(3)如果以l, r为边界的子字符串为回文字串,判断此回文字串的长度如果大于max_len, 则max_len = l - r + 1;最长回文字串为l, r为边界的字符串。
(4)如果以l, r为边界的子字符串不为回文字串,则max_len和最长回文字串不变。
注意:此思路的时间复杂度为O(n^3)。
改进算法
(1)以一重复字符的字符串为中心扩展,寻找最长回文字串,此算法与以单个字符为中心扩展类似。(由于重复字符的字符串一定为回文子串,以一重复字符的字符串为中心扩展的字符串一定为回文字串。)
代码实现
思路1
@requires_authorization
class Solution {
public:
string IsCorrect(int l, int r, string s) {
int l1 = l;
int r1 = r;
while (l < r && s[l] == s[r]) {
l++;
r--;
}
if (l < r) {
return "";
} else {
string s1 = "";
for (int i = l1; i <= r1; i++) {
s1 += s[i];
}
return s1;
}
}
string longestPalindrome(string s) {
if (s.length() == 1) {
return s;
}
int l, r;
string s1 = "";
for (int l = 0; l < s.length(); l++) {
for (int r = s.length(); r >= l; r--) {
if (IsCorrect(l, r, s) != "") {
if ((r - l + 1) > s1.length()) s1 = IsCorrect(l, r, s);
}
}
}
return s1;
}
};
改进算法
@requires_authorization
class Solution {
public:
string longestPalindrome(string s) {
int max = 0;
string s2 = "";
for (int i = 0; i < s.length();) {
int k, j;
k = i;
j = i;
while (k < s.length() && s[k] == s[k + 1]) k++;
i = k + 1;
while (k < s.length() && j > 0 && s[k + 1] == s[j - 1]) {
k++;
j--;
}
if (k - j + 1 > max) {
max = k - j + 1;
s2 = "";
for (int g = j; g <= k; g++) {
s2 += s[g];
}
}
}
return s2;
}
};