刷第二遍leetcode了啦!本题的解法见证了自己对解回文子字符串题目的认知过程。有点感触,便记录了两种解法。第一种是有多幼稚哈,但也是学习过程中的一部分。对自己喊加油,再刷100道题。
题目:Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.
举例如下:
Input: "babad"
Output: "bab"
Note: "aba" is also a valid answer.
Input: "cbbd"
Output: "bb"
解法一(现在看,真是不忍直视哈)
string longestPalindrome(string s) {
int k = s.size();
if (k == 0 || k == 1)
return s;
while (k != 1) {
for (int i = 0; i + k <= s.size(); ++i) {
int m = i, n = k - 1 + i;
while (s[m++] == s[n--]) {
if (m >= n) {
return s.substr(i, k);
}
}
}
--k;
}
return s.substr(0, 1);
}
解法二(第二次上手时写的,稍稍修改还可以提升运行速度,因为有一些是不需要再遍历的)
string longestPalindrome(string s) {
int sLen = s.size();
int maxRes = 0;
int left, right;
int pos;//用来记录最终子字符串起始位置
for (int i = 0; i < sLen; ++i) {
left = right = i;
while (right < sLen && s[left] == s[right + 1]) ++right;//计算起始时重复的字符
i = right;//重复的字符,在下次for循环时就直接跳过
while (left > 0 && right < sLen - 1 && (s[left - 1] == s[right + 1])) {
--left;
++right;
}
//maxRes = max(maxRes, right - left + 1);
if (maxRes < right - left + 1) {
pos = left;
maxRes = right - left + 1;
}
}
return s.substr(pos, maxRes);
}