博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

找出字符串中重复出现且最长的子字符串

Posted on 2012-09-15 16:23  tao tao  阅读(1095)  评论(0)    收藏  举报

给一个字符串、例如 “ababc”要求返回“ab”,因为“ab”连续重复出现且最长。  用C/C++语言写一函数完成该算法,给出复杂度

 

 1 int totalLen;
 2  totalLen = strlen(str);    //取得整个字符串的长度。
 3  
 4  int index;                 //从左到右扫描到的索引值.
 5  
 6  char * tmpstr;            //用来保存临时的连续重复出现的字符串.
 7  
 8  int startIndex = 0;
 9  int maxlen = 0;
10  char *maxstr;            //保存最长的连续重复出现的字符串.
11  
12  /*
13  
14  先从最左的开始,一个一个字符地扫描,设扫到的index为index.
15  
16  在扫描到的字符及其右边的所有字符里查找最长的连续出现的字符串.
17  
18  具体方法是:
19  
20  1.取得这些字符串的长度,除以2,得到可能的重复字符串的最长长度.
21  
22  2. 判断substr(index,index+len)和substr(index+len,index+len+len)是不是一样,是的话返回substr(index,index+len);
23  
24  3.不是则len-1,重复第2步直到len = 0;
25  
26  4.index 加一,重复第1步.
27  
28  例如有"cababc",则:
29  
30  totalLen = 6;index = 0;
31  
32  现在从左开始
33  
34  当index = 0 时,在"cababc"里找,len = totalLen/2 = 3;
35  
36  1.cab != abc len --;
37  
38  2.ca != ba len --;
39  
40  3.c != a len --;
41  
42  index ++; 则现在在"ababc"里查找
43  
44  ab == ab 返回"ab",保存在tmpstr和maxstr里
45  
46  index ++ ;则现在在"baba"里查找
47  
48  ...
49  
50  ...
51  
52  找不到...
53  
54  若是以后查到也有连续出现的字符串,则先保存在tmpstr里,然后长度与maxstr的长度比较,若是长度大于maxstr,则maxstr = tmpstr;
55  
56  返回maxstr即可.
57  
58   */

 

 

 

 1 char * GetRepeatLongestSuhStr(char * str)
 2  
 3  {
 4  
 5     int index, startIndex, i;
 6  
 7     int sublen, totalLen, maxlen;
 8  
 9     char *tmpstr, *maxstr;
10  
11   
12  
13     startIndex=0;
14  
15     totalLen=strlen(str);
16  
17     maxlen = 0;
18  
19   
20  
21     for(index=0; index<totalLen; index++)
22  
23     {
24  
25       sublen = (totalLen - index)/2;
26  
27       printf("/tsublen=%d",sublen);
28  
29       for( ;sublen > 0 ;sublen --)
30  
31       {
32  
33           int tmp = 0;
34  
35           while((str[index + tmp] == str[index+sublen+tmp]) && (tmp < sublen))
36  
37               tmp++;
38  
39           if(tmp > 0)
40  
41             if(tmp > maxlen)
42  
43             {
44  
45               maxlen = tmp;
46  
47               startIndex = index;
48  
49             }
50  
51       }
52  
53     }
54  
55     if(maxlen > 0 )
56  
57     {
58  
59       maxstr =(char *)malloc(maxlen+1);
60  
61       for(i = 0 ;i < maxlen ;i ++)
62  
63          maxstr[i] = str[startIndex+i];
64  
65       maxstr[maxlen] = '/0';
66  
67       return maxstr;
68  
69     }
70  
71     return NULL;
72  
73  }
74  
75   
76  
77  void main()
78  
79  {
80  
81     char * tmp = "eabcdabcdb";
82  
83     char * str = GetRepeatLongestSuhStr(tmp);
84  
85     printf("/t%s/n",str);
86  
87  }