题目描述
解题思路
题目要求从一个字符串s的子字符串中找到一个最长的回文字符串,那么解题思路显而易见,1是要求子字符串是回文字符串,2是要求该字符串是最长的。
回文字符串有个显然的特征是沿着中心那个字符轴对称。所以对于每个字符串我们只需要从中心向两端展开,观察两端的字符是否相同即可判断是否为回文字符串,而最长这一点,我们可以设置个变量longest,每次遍历完一个子字符串都与longest做比较。这样时间复杂度就是O(n^2)。
c++代码实现
class Solution {
public:
string Palindrome(string s, int left, int right) {
int length = s.length();
while (left >= 0 && right < length && s[left] == s[right]) {
left--;
right++;
}
return s.substr(left + 1, right - left -1);
}
string longestPalindrome(string s) {
int n = s.length();
if (n == 0) return "";
string longest = s.substr(0, 1);
for (int i = 0; i < n-1; ++i) {
string s1 = Palindrome(s, i, i);
if (s1.length() > longest.length()) longest = s1;
string s2 = Palindrome(s, i, i+1);
if (s2.length() > longest.length()) longest = s2;
}
return longest;
}
};
运行结果:
反思与总结
此题难度一般,但凡设计到回文字符串,一般都会采用我上面的解题思路,但这里阐述了更为简洁的做法,不得不佩服其境界之高!