【发布时间】:2012-07-26 04:19:50
【问题描述】:
对于以下问题,我很难找到比 O(n^2) 更好的方法。
我得到一个字符串,例如xyxxz。
现在我需要在给定字符串的每个前缀中找到匹配字符的总数。
这里,字符串的可能前缀是:
xyxxz : matching characters is 5
yxxz : matching characters is 0 (since 1st character doesnt match)
xxz : matching characters is 1
xz : matching characters is 1
z : matching characters is 0
这应该是输出。 我做了以下代码:
cin>>str;
len=str.length();
for(i=0;i<len;i++){
sum=0;
k=i;
for(int j=0;j<len;j++)
{
if(str[k] == str[j]){
sum++;
k++;
}
else
break;
}
cout<<sum<<" "; //I get the output 5 0 1 1 0
}
但它是 O(n^2)。我想要一个更好的方法:可能是 O(n) 或 O(nlogn)。
提前致谢。
【问题讨论】:
-
指出
std::mismatch,IIRC 是线性复杂度。 -
这会有所帮助。谢谢@chris :)
-
如果你想要的话,this page 有一个可能的实现。这是您可以改进的起点。
-
不是这回答了你的问题,但我认为你不需要
else break;行。 -
mismatch 需要 O(n).. 并且如前所述对每个可能的前缀应用不匹配,它又会是 O(n^2)。不是吗?
标签: c++ string algorithm suffix-array