您的位置:首页 > 其它

LeetCode 5. Longest Palindromic Substring

2016-05-16 22:33 351 查看
#include <iostream>
#include <vector>
using namespace std;

/*
Given a string S, find the longest palindromic substring in S. You may assume that the
maximum length of S is 1000, and there exists one unique longest palindromic substring.
*/

int longestPalindromeSubstring(string s) {
if(s.size() <= 1) return s.size();
int n = s.size();
vector< vector<bool> > P(n, vector<bool>(n, false));
for(int i = 0; i < n; ++i) {
P[i][i] = true;
}
int maxLen = 1;
for(int L = 2; L <= n; ++L) {
for(int start = 0; start < n - L + 1; ++start) {
int end = start + L - 1;
if(L == 2) P[start][end] = (s[start] == s[end]);
else P[start][end] = ((s[start] == s[end]) && P[start + 1][end - 1]);
}
}
for(int i = 0; i < n; ++i) {
for(int j = i+1; j < n; ++j) {
if(P[i][j]) maxLen = max(maxLen, abs(j - i + 1));
}
}
return maxLen;
}

int main(void) {
int maxLen = longestPalindromeSubstring("accbaaaabc");
cout << maxLen << endl;
}


Second Round: two pointers, one goes left, one goes right.

#include <string>
#include <iostream>
using namespace std;

string maxPalindrome(string str) {
if(str.size() <= 1) return str;
int a = 0, b = 0, size = str.size();
int mark = 0;
int maxLen = 1;
for(int i = 0; i < size && (2 * (size - i) > maxLen);) {
a = b = i;
for(; b + 1 < size && (str[b] == str[b+1]); ++b); // remove duplicates
i = b + 1;
for(; a > 0 && b + 1 < size && (str[a-1] == str[b+1]); --a, ++b) { // two pointers, one goes left, one goes right.
;
}
if(b - a + 1 > maxLen) {
maxLen = b - a + 1;
mark = a;
}
}
return str.substr(mark, maxLen);
}

int main(void) {
cout << maxPalindrome("baaaaabb") << endl;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: