这是一个使用标准库编写的C++代码,用于查找字符串S与其后缀的相似度。
尽管它能给出正确的结果,但对于较长的字符串而言,它需要花费很长时间。以下是代码:
#include <iostream>
#include <string>
using namespace std;
int sim(string a, string b){
int count=0;
int sa=a.size();
int sb=b.size();
int iter;
if(sa>sb) iter=sb;
else iter=sa;
for(int i=0; i<iter; i++){
if (a[i]!=b[i]) break;
else count++;
}
return count;
}
int strsim(string a){
int sum=0;
int s=a.size();
for(int i=0; i<s; i++){
sum=sum+sim(a,a.substr(i));
}
return sum;
}
int main(){
int n;
cin >> n;
string a[n];
for(int i=0; i<n; i++){
cin >> a[i];
}
for(int i=0; i<n; i++){
cout << strsim(a[i]) << '\n';
}
}
约束条件: 每个字符串的长度最多为100000,仅包含小写字符,并且测试用例的数量“n”不能超过10。
样本输入/输出:
输入:
1 ababaa
输出:
11
即,
6 + 0 + 3 + 0 + 1 + 1 = 11
。
a.substr(i)
返回一个全新的字符串,这会产生动态分配。将你的函数改为使用迭代器(这是大多数C++算法的风格),这样你就可以将不同的迭代器传递到字符串中。 - GManNickGchar *
,在你的strsim
函数中将a
与&a[i]
进行比较。 - user2553780