题目
思路分析
- 中心扩向两边的思想,根据回文串的性质,如
str = "aba"
,从b
出发,往两边同时遍历并比较字符是否相同即可,令left = i - 1
,right = i + 1
,那么依次比较str[left] == str[right]
是否成立。如成立,继续比较,若不成立,则结束此次迭代,并进行i ++
下一次比较。该方法的最大时间复杂度为O(n^2)
. - 动态规划的思想,该方法由小到大、由短到长进行判断是否是回文串(对于单个字符都默认为回文串,即长度为
1
,该性质也作为初始化dp
数组的条件(dp[i][j]
表示下标从i
到j
的子字符串),即dp[i][j]=true
)。那么后续的判断都在该基础上进行。如判断dp[i][i + len - 1]
回文串true
orfalse
,只需判断s[i] == s[i + len - 1]
是否成立,若成立,则dp[i][i + len - 1] = dp[i + 1][i + len - 2]
,否则dp[i][i + len - 1] = false
。当然,其中存在一个细节问题,请看代码实现。
题解1
class Solution {
public:
string longestPalindrome(string s) {
int left, right;
string max_str = "", cur_str = "";
for(int i = 0;i < s.length(); ++i){
left = i - 1, right = i + 1;
cur_str = s[i];
for(int j = right; right < s.length(); ++j){
if(s[i] == s[j])
cur_str += s[j];
else{
right = j;
break;
}
}
while(left >= 0 && right < s.length()){
if(s[left] == s[right])
cur_str = s[left] + cur_str + s[right];
else
break;
left --;
right ++;
}
max_str = (max_str.size() < cur_str.size() ? cur_str : max_str);
if (s.length() - i < max_str.size() / 2)
break;
}
return max_str;
}
};
提交结果
题解2
class Solution {
public:
string longestPalindrome(string s) {
if(s.size() <= 1)
return s;
// Construct dp [i] [j] to indicate whether the substring of the subscripts i to j of the string is a palindrome string
vector<vector<int>> dp(s.size(), vector<int>(s.size()));
int start = 0, end = 0;
// A single character is a palindrome string
for(int i = 0;i < s.size(); ++i)
dp[i][i] = true;
// Traverse from a minimum length of 2
for(int len = 2; len <= s.size(); ++len){
for(int i = 0; i < s.size() - len + 1; ++i){
// Unequal first and last characters
if(s[i] != s[i + len - 1])
dp[i][i + len - 1] = false;
else{
if (len <= 2)
dp[i][i + len - 1] = true;
// Determine whether the included string is a palindrome string
else
dp[i][i + len - 1] = dp[i + 1][i + len - 2];
}
// Update the beginning and end positions of the maximum palindrome string
if (dp[i][i + len - 1] && len >= end - start + 1){
start = i;
end = i + len - 1;
}
}
}
return s.substr(start, end - start + 1);
}
};
提交结果