最长回文字符串

一个字符串中连续的一段就是这个字符串的子串,而回文串指的是12421这种从前往后读和从后往前读一模一样的字符串,所以最长回文子串的意思就是这个字符串中最长的身为回文串的子串啦!

求解思路

对于最长回文字符串的求解,有如下要点:

  • 以字符串中每个结点为中心结点,向左向右进行回文字符串的判定求解,遍历字符串得出结果;
  • 在左右判定之前,首先判断中心结点是否处于连续的相同字符子串中,比如abbbab进行判定的时候,应该将中间bbb看做一个整体作为一个结点进行计算;
  • 为了便于判定遍历的结束,在字符串开始添加一个&符号作为结束标志,即将字符串由abbbabba转换成&abbbabba

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
#include <string>
using namespace std;

int find(char *ch)
{
int ans = 1;
int i, p, n;
for(i = 0; ch[i]; ++i)
{
p = i;
n = i;
while(ch[n + 1] == ch[i]) //重复字符子串判定
n++;
i = n; //跳过重复字符子串
while(ch[p - 1] == ch[n + 1]) //左右回文字符判定,'&'给出判定的结束标志
{
p--;
n++;
}
if(ans < (n - p + 1))
ans = n - p + 1;
}
return ans;
}

int main()
{
int num;
char temp[1000002];
temp[0] = '&';
cin >> num;
for(int i = 0; i < num; ++i)
{
cin >> temp + 1;
cout << find(temp) << endl;
}
return 0;
}
-------------本文结束感谢您的阅读-------------
0%