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"
思路:分别找奇数长度和偶数长度的回文串,输出最长的那一个。
匹配回文串的过程:
奇数长度:设置mid指针、pre指针和last指针。mid指针从前向后移动,每次移动后,pre和last指针以mid为中点向首尾两个方向延伸,直到两个指针的值不同结束。记录长度,若当前长度now大于当前已有的最大长度max,则记录now,并从pre开始摘抄now个字符,作为当前的最长回文串。
偶数长度:过程类似,不过要有mid和mid2同时标记相邻的两个字符作为延伸的中点。
代码比较丑陋,总有考虑不到的地方,改了又改,满是补丁。
string longestPalindrome(string s) {
string::iterator mid = s.begin();
string::iterator mid2 = s.begin();
string::iterator pre = mid;
string::iterator last = mid;
bool flag = false;
int max = 0;
int now = 0;
string maxstr;
string maxstr2;
//找奇数长度的回文串
for (; mid != s.end(); mid++) {
pre = mid; last = mid;
if (mid != s.begin() && mid != s.end()) {
flag = false;
while (1) {
if (pre == s.begin()) break;
else if (last == s.end()) break;
else {
while (1) {
if (pre == s.begin()) break;
pre--; last++;
if (last == s.end()) {
pre++; last--;
break;
}
if (*pre != *last) {
pre++; last--;
break;
}
}
now = last - pre + 1;
if (now > max) {
max = now;
maxstr = "";
for (int i = 0; i<now; i++) {
maxstr += *(pre + i);
flag = true;
}
if (flag == true) break;
}
else {
break;
}
}
}
}
else {
now = 1;
if (now > max) {
maxstr = "";
maxstr += *mid;
}
}
}
if (s.size() < 2) return maxstr;
//找偶数长度的回文串
for (mid = s.begin(), mid2 = mid + 1; mid2 != s.end(); mid++, mid2++) {
pre = mid; last = mid2;
while (pre != s.begin() && last != s.end()) {
if (pre == s.begin()) break;
else if (last == s.end()) break;
while (*pre == *last) {
if (pre == s.begin()) break;
pre--; last++;
if (last == s.end()) break;
}
if (last != s.end()) {
if (*pre == *last) {
}
else {
pre++; last--;
}
}else{
pre++; last--;
}
now = last - pre + 1;
if (now > max) {
max = now;
maxstr2 = "";
for (int i = 0; i < now; i++) {
maxstr2 += *(pre + i);
}
break;
}
else break;
}
if (pre == s.begin()) {
if (*pre == *last) {
now = 2;
if (now > max) {
max = now;
maxstr2 = "";
for (int i = 0; i < now; i++) {
maxstr2 += *(pre + i);
}
}
}
}
}
if (maxstr.size() > maxstr2.size()) return maxstr;
else return maxstr2;
网上一位大佬的代码,学习下:
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);
}