牛客笔试题---求最长重复词长度之和

  ①题目要求:

  对于两个字符串B和C,我们定义BC为将C接在B的后面形成的新串。一个字符串P是串A的前缀,当且仅当存在B使得A=PB,当然B可以为空串。若P!=A,则我们称P为A的真前缀。现在定义重复词。串Q是串A的重复词当且仅当Q是A的真前缀,且A是QQ的前缀。而A的最长重复词则是A的重复词中最长的一个,或者空串(当A没有任何重复串时)。如ababab的最长重复词是abab;abc的最长重复词是空串。

  给定一个串s(由字母组成),及它的长度n(1≤n≤100000),请返回s的所有前缀的最长重复词的长度之和(空串长度为0)。

  测试样例:
  8,"babababa"
  返回:24


实现:
 1 #include<string>
 2 class Periods {
 3 public:
 4     long long getLongest(int n, string s) {
 5         // write code here
 6         long long    res = 0;
 7 
 8         //1求所有前缀
 9         for (int i = 0; i <= n; i++)
10         {
11             
12             string subS = s.substr(0, i);        //前缀
13 
14             bool get = false;    //是否获得最长重复词
15 
16             //判断是否是重复词。//要求之一是qq 有前缀A所以长度限制
17             for (int k = i-1; k >= i / 2; k--)
18             {
19                 //真前缀  i-1 保证
20                 string subsubS = subS.substr(0, k);
21                 
22                 //前缀
23                 string supS = subsubS + subsubS;
24                 string tmp = supS.substr(0, subS.length());
25                 if (subS == tmp)
26                 {
27                     get = true;
28                     cout << subS << ":::::" << "\t";
29                     cout << subsubS << endl;
30                     res += subsubS.length();
31                 }
32                 else if (get == true)break;
33             }
34         }
35         return res;
36     }
37 };

测试:

 1 void main()
 2 {
 3     Periods per;
 4     string s1 = "babababa";
 5     cout << per.getLongest(8, s1) << endl;
 6 
 7     s1 = "baaaba";
 8     cout << per.getLongest(6, s1) << endl;
 9 
10     s1 = "babababaa";
11     cout << per.getLongest(9, s1) << endl;
12 
13     s1 = "";
14     cout << per.getLongest(0, s1) << endl;
15 
16 }

输出:

  24

  8
  24
  0
  请按任意键继续. . .

posted @ 2016-01-16 23:29  狼行博客园  阅读(646)  评论(0编辑  收藏  举报