密码截取

好吧,这两天面临着找实习工作的事了。然后huawei发过来一个账号,我打开就看到这道题了。

其实好久都没有编程了,脑子在这个当口转得还是比较慢的。

看了老半天,才发现,这个是输入一个随机字符串,求出它的最长对称字符串的长度。

所以,怎么做,就很明白了。

首先将原字符串进行倒置,然后进行移位比较,设置计数器,得到,相同的最大值。就像下面这样:

原串是str1=“avvbeeb”,将其翻转得到str2=“beebvva”,然后错位比较:

    1:               avvbeeb

               str2:beebvva             (上下对齐的元素是a;a比较)

 

2:              avvbeeb

str2:beebvva           (上下对齐的量元素av;va比较,不对称)

…………

11:              avvbeeb

str2:                  beebvva           (上下对齐的量元素beeb;beeb比较,得到最长对称子串)

…………

该方法要移动m+n次,每次元素比较个数从1到m不等,复杂度O(n2);

就这样就求得了最长对称子串的长度了。

代码如下:

 1 #include <iostream>
 2 #include <string.h>
 3 using namespace std;
 4 int Maxsubstr(char a[],char b[])
 5 {
 6     int start1,start2;
 7     int count=0,Max=0;
 8     for(int i=0;a[i]!='\0';i++)
 9         for(int j=0;b[j]!='\0';j++)
10         {
11             start1=i;start2=j;
12             while(a[start1]==b[start2] && start1<strlen(a) && start2<strlen(b))
13             {
14                 start1++;
15                 start2++;
16                 count++;
17             }
18             if(count>Max)
19                 Max=count;
20             count=0;
21         }
22         return Max;
23 }
24 
25 char *Switch(char a[])
26 {
27     int n=strlen(a);
28     char temp;
29     for(int i=0;i<n/2;i++)
30     {
31         temp=a[i];
32         a[i]=a[n-1-i];
33         a[n-1-i]=temp;
34     }
35     return a;
36 }
37 
38 int main()
39 {
40     char a[80];
41     char b[80];
42     char *c;
43     gets(a);
44     strcpy(b,a);
45     c=Switch(a);
46     cout<<Maxsubstr(b,c);
47     return 0;
48 }

 对称子串部分,引用了网友的一些总结,链接如下:http://www.jb51.net/article/48090.htm

posted @ 2015-03-26 20:09  {Black_Jack}  阅读(494)  评论(0编辑  收藏  举报