LeetCode练习_20170521_找最大回文串

来源:互联网 发布:数据挖掘公司排名 编辑:程序博客网 时间:2024/05/21 03:24

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);}


原创粉丝点击