我希望能够在C++中查找字符串中所有子字符串的频率。目前我正在使用以下方法:
unordered_map<string,int> mp;
string s;// the string of which we want all substrings... n is length
cin>>s;
string t;
for(int i=0,i<=n-1;++i) // starting point of a substring
{
t="";
for(int j=i;j<=n-1;++j) // all substrings startings at i
{
t+=s[j];
++mp[t];
}
}
我想优化它的时间复杂度。有更好的算法吗?抱歉,如果不是这里讨论的话我就关闭它了。
编辑:
这是我想出来的...维护一个包含字符串所有后缀的trie树。然后遍历所有以i为起点的子串,这样搜索就是O(1)。
每个节点都指定一个子字符串(后缀的前缀)。现在在每个节点上维护频率并相应地更新它。虽然这种方法是O(n^2),但由于内存分配和将下一个指针重置为NULL(26次),所以常数相当大。我能进一步优化它吗?还有比链表更快的存储trie树的替代方法吗?我能够压缩我的解决方案,但很接近时间限制。
++mp[v];
中的v
是什么? - tsuki