回文子串是指从前往后和从后往前一致的对称的字符串。这种字符窜分为,奇偶两种类型,在寻找回文字符串的时候,可以按照递归的方法寻找,即,如果首尾两个字符相同,则继续寻找下一层,直至只有一个字母或者没有字母为止,此时的字符串就是回文字符串。
而,我们的程序目的是在一个字符串中, 找出,长度最长的回文字符串,可以按照上面的逆向思路来寻找,即,针对每一个字符,或者空格,寻找是否存在以其为中心的回文字符串。
注意,这里分为奇和偶两种不同的情况。奇数时,回文字符串的中心是一个字符,偶数时,回文字符串的中心是一个空格。两种情况一块考虑即可
我们的算法是,搜寻每一个空格和单字符,判断是否存在以其为中心的回文字符串。程序的主要代码如下:
1 class Solution {
2 public:
3 string longestPalindrome(string s) {
4 int maxLoc=0;
5 int maxNum=1;
6 const int stringSize=s.size();
7 if(stringSize==1){
8 return s;
9 }
10
11 for(int i=1; i!= 2*stringSize-1-1;++i){
12 int a, b;
13 int num=1;
14 if(i%2==0){ //even
15 a=(int)(i-1)/2;
16 b=(int)(i+1)/2+1;
17 num=1;
18 }
19 else{ //old
20 a=(int)(i-1)/2;
21 b=(int)(i+1)/2;
22 num=0;
23 }
24
25 while(a>=0 && b<=stringSize){
26 if(s[a] == s[b]){
27 num=num+2;
28 a--;
29 b++;
30 }
31 else{
32 break;
33 }
34 }
35 if(num>maxNum){
36 maxNum=num;
37 maxLoc=i;
38 }
39 }
40
41 if(maxLoc%2==0){
42 return s.substr(maxLoc/2-(maxNum-1)/2, maxNum);
43 }
44 else{
45 return s.substr(maxLoc/2+1-maxNum/2, maxNum);
46 }
47 }
48 };