计算字符串中子字符串的出现

时间:2019-10-25 12:01:30

标签: c++ string substring

首先,我知道这个问题有很多重复之处,但是我已经尝试了很多次,但都没有能够解决我的问题。

我有以下字符串

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”

2 个答案:

答案 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;
        }
    }
}

您需要

  1. 在t上循环,并在i循环的末尾而不是内部递减
  2. 将i限制为s.length()-t,以便始终有一个t长度的字符串作为str
  3. 将您的substr固定为从我不为0开始

您也可以在第一次找到重复项时停止,因为这将是最大的重复项(例如,如果有两对长度为4的重复项,它将找到其中一个,但是听起来不像您同时需要)。您还应该始终使用size_t作为整数类型,因为这是这里的字符串函数所使用的。

答案 1 :(得分:-3)

好的。您是否需要<< endl;才能在终端中查看输出?