首先,我知道这个问题有很多重复之处,但是我已经尝试了很多次,但都没有能够解决我的问题。
我有以下字符串
string s = "asdfqasdfp";
我需要遍历字符串并查找哪个子字符串出现多次。所以在这种情况下
asdf
我编写了以下代码,但我不知道为什么它不起作用。我从完整的字符串开始,然后一次向下滚动。我应该得到2的出现值。
int t = s.length();
for (int i = 0; i < s.length(); i++) {
string str = s.substr(0, t);
int occurence = 0;
size_t start = 0;
while ((start = s.find(str, start)) != string::npos) {
++occurence;
start += str.length();
}
if (occurence > 1) {
cout << occurence;
}
else {
--t;
}
}
编辑:在这种情况下,我只想要字符串包含的最大子字符串
“ asdf”
答案 0 :(得分:4)
这是您代码的固定版本,其中包括Daniel的建议(感谢Daniel's demo)
for (size_t t = s.length(); t >= 1; --t) {
for (size_t i = 0; (i + t) <= s.length(); i++) {
std::string str = s.substr(i, t);
size_t occurence = 0;
size_t start = 0;
while ((start = s.find(str, start)) != std::string::npos) {
++occurence;
start += str.length();
}
if (occurence > 1) {
std::cout << str << " " << occurence << std::endl;
return 0;
}
}
}
您需要
您也可以在第一次找到重复项时停止,因为这将是最大的重复项(例如,如果有两对长度为4的重复项,它将找到其中一个,但是听起来不像您同时需要)。您还应该始终使用size_t作为整数类型,因为这是这里的字符串函数所使用的。
答案 1 :(得分:-3)
好的。您是否需要<< endl;
才能在终端中查看输出?