您的位置:首页 > 其它

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

2016-01-16 23:29 232 查看
  ①题目要求:

  对于两个字符串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

实现:


#include<string>
class Periods {
public:
long long getLongest(int n, string s) {
// write code here
long long    res = 0;

//1求所有前缀
for (int i = 0; i <= n; i++)
{

string subS = s.substr(0, i);        //前缀

bool get = false;    //是否获得最长重复词

//判断是否是重复词。//要求之一是qq 有前缀A所以长度限制
for (int k = i-1; k >= i / 2; k--)
{
//真前缀  i-1 保证
string subsubS = subS.substr(0, k);

//前缀
string supS = subsubS + subsubS;
string tmp = supS.substr(0, subS.length());
if (subS == tmp)
{
get = true;
cout << subS << ":::::" << "\t";
cout << subsubS << endl;
res += subsubS.length();
}
else if (get == true)break;
}
}
return res;
}
};


测试:

void main()
{
Periods per;
string s1 = "babababa";
cout << per.getLongest(8, s1) << endl;

s1 = "baaaba";
cout << per.getLongest(6, s1) << endl;

s1 = "babababaa";
cout << per.getLongest(9, s1) << endl;

s1 = "";
cout << per.getLongest(0, s1) << endl;

}


输出:

  24

  8
  24
  0
  请按任意键继续. . .
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: