一段字符串中提取最长的回文长度:
浅显易懂的想法就是假设任何一个位置的字符为回文中心,进行两个方向的扩散,进而提取最长回文。
这是最朴素的想法:
代码如下:
1
#include
<
iostream
>
2 #include < string >
3 using namespace std;
4
5 char str[ 100 ] = " abbbbaaa " ;
6
7
8 // 如果是回文长度是偶数个
9 int getMidtwoNum( char * s, int length, int index)
10 {
11 int re = 1 ;
12 int t = index,b = index + 1 ;
13 while (t >= 0 && b < length && s[t] == s[b])
14 {
15 if (t == index)
16 re ++ ;
17 else
18 re += 2 ;
19 b ++ ;
20 t -- ;
21 }
22 return re;
23 }
24
25 // 回文长度是奇数个
26 int getMidoneNum( char * s, int length, int index)
27 {
28 int re = 1 ;
29 int t = index - 1 ,b = index + 1 ;
30 while (t >= 0 && b < length && s[t] == s[b])
31 {
32 re += 2 ;
33 b ++ ;
34 t -- ;
35 }
36 return re;
37 }
38
39 int getLhw( char * s)
40 {
41 int length = strlen(s);
42 int re = 0 ;
43 int temp = 0 ;
44 for ( int i = 0 ;i < length;i ++ )
45 {
46 temp = max(getMidoneNum(s,length,i),getMidtwoNum(s,length,i));
47 if (temp > re)
48 {
49 re = temp;
50 }
51 }
52 return re;
53 }
54 int main()
55 {
56 cout << getLhw(str) << endl;
57 getchar();
2 #include < string >
3 using namespace std;
4
5 char str[ 100 ] = " abbbbaaa " ;
6
7
8 // 如果是回文长度是偶数个
9 int getMidtwoNum( char * s, int length, int index)
10 {
11 int re = 1 ;
12 int t = index,b = index + 1 ;
13 while (t >= 0 && b < length && s[t] == s[b])
14 {
15 if (t == index)
16 re ++ ;
17 else
18 re += 2 ;
19 b ++ ;
20 t -- ;
21 }
22 return re;
23 }
24
25 // 回文长度是奇数个
26 int getMidoneNum( char * s, int length, int index)
27 {
28 int re = 1 ;
29 int t = index - 1 ,b = index + 1 ;
30 while (t >= 0 && b < length && s[t] == s[b])
31 {
32 re += 2 ;
33 b ++ ;
34 t -- ;
35 }
36 return re;
37 }
38
39 int getLhw( char * s)
40 {
41 int length = strlen(s);
42 int re = 0 ;
43 int temp = 0 ;
44 for ( int i = 0 ;i < length;i ++ )
45 {
46 temp = max(getMidoneNum(s,length,i),getMidtwoNum(s,length,i));
47 if (temp > re)
48 {
49 re = temp;
50 }
51 }
52 return re;
53 }
54 int main()
55 {
56 cout << getLhw(str) << endl;
57 getchar();
58 }