本文接着讨论最长回文子串
解法三:暴力向外扩张,从i位置开始,向两边扩张,不超出[0,s.length()-1],如果相等继续扩张,如果不等,继续下一个位置;
注意奇偶回文,奇回文以当前位置为中心,偶回文以i, i + 1中间位置为中心
class Solution {
public:
int begin = 0;
int len = 1;
void expand(string s,int l,int r)
{
while(l >=0 && r < s.length() && s[l] == s[r])
{
l--;
r++;
}
if(r - l - 1 > len)
{
begin = l + 1;
len = r - l - 1;
}
}
string longestPalindrome(string s) {
int n = s.length();
if(n < 2)
return s;;
for(int i = 0; i < n; i++)
{
expand(s,i,i); //奇回文,回文中心i
expand(s,i,i+1); //偶回文,回文中心空
}
string res = s.substr(begin,len);
return res;
}
};
解法四:动态规划的剪枝,获得了较高的效率
string longestPalindrome(string s) {
if (s.empty()) return "";
if (s.size() == 1) return s;
int min_start = 0, max_len = 1;
for (int i = 0; i < s.size();) {
if (s.size() - i <= max_len / 2) break;
int j = i, k = i;
while (k < s.size()-1 && s[k+1] == s[k]) ++k; // Skip duplicate characters.
i = k+1;
while (k < s.size()-1 && j > 0 && s[k + 1] == s[j - 1]) { ++k; --j; } // Expand.
int new_len = k - j + 1;
if (new_len > max_len) { min_start = j; max_len = new_len; }
}
return s.substr(min_start, max_len);
}