2012华为2011年9月17日上机题目之最长回文
一段字符串中提取最长的回文长度:
浅显易懂的想法就是假设任何一个位置的字符为回文中心,进行两个方向的扩散,进而提取最长回文。
这是最朴素的想法:
代码如下:
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 }
作者:W.M.steve
出处:http://www.cnblogs.com/weisteve/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
出处:http://www.cnblogs.com/weisteve/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。