/Author: yqtao
//Email : [email protected]
//Date :2016.7.4
/**************************************************************
*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.
*
*S=”abadcacd” ,return “dcacd”
************************************************************************/
解析:
题目的意思是让求最长的回文字串,例如S=”abadcacd” ,return “dcacd”这样。
定义i为中间的指针,即不让其越界的指针,
定义j为一个字串的开始指针,
定义k为一个字串的结束指针。
例如,当i=5是s[i]=a,则另 j=k=i=5,因此让k后移一位,与j前移一位比较两者是否相等,若等,则k++,j–;再次进行比较,因此就能得出他的最长回文字串了,想法非常的巧妙。
需要注意的是当s.size() - i <= max_len / 2时,此时直接返回,因为即使后面全是回文的也是与maxlen相等。
#include<iostream>
#include <algorithm>
#include <string>
using namespace std;
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; //j is a pre pointer,k is next pointer
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);
}
//测试
int main()
{
string s = "abadcacd";
string result = longestPalindrome(s);
cout << result << endl;
}