能否为现有子串检测函数添加子序列出现次数统计变量?是否需另行创建函数?
嘿,这个问题问得很实际!其实两种方案都可行,具体选哪种要看你的需求场景,我给你拆解一下:
方案一:修改现有函数,添加统计功能
如果你不介意调整原函数的接口,而且希望它同时完成「判断是否存在」和「统计出现次数」两个任务,完全可以在现有函数基础上修改。不过要注意:原函数返回的是bool,直接改返回值会破坏已有调用逻辑,所以更稳妥的方式是加一个引用参数来传递统计结果,同时保留原有的布尔返回值语义。
修改后的代码示例(注意处理子串重叠的情况,注释里有说明):
bool SearchString(string sir1, string sir2, int& count) { count = 0; // 初始化计数为0 if (sir2.size() > sir1.size()) return false; for (int i = 0; i < sir1.size(); ) { // 这里取消自动i++,避免内部调整冲突 int j = 0; if (sir1[i] == sir2[j]) { int k = i; // 匹配子串的逻辑 while (j < sir2.size() && i < sir1.size() && sir1[i] == sir2[j]) { j++; i++; } if (j == sir2.size()) { count++; // 找到一次就计数+1 // 处理重叠匹配:如果允许子串重叠(比如"aaa"找"aa"要算2次),就写i = k + 1 // 如果不允许重叠,就写i = k + sir2.size() i = k + 1; } else { i = k + 1; // 匹配失败,回到下一个字符继续 } } else { i++; } } return count > 0; // 保持原逻辑:存在则返回true,否则false }
调用的时候只需要传入一个int变量接收计数:
int count = 0; bool exists = SearchString("abcabcabc", "abc", count); // 此时exists为true,count为3
方案二:新建一个专门的统计函数
如果原函数已经被很多地方调用,不想修改它的接口,或者希望遵循单一职责原则(一个函数只做一件事),那新建一个独立的统计函数会更合适。这样原函数依然只负责判断子串是否存在,统计功能交给新函数,代码逻辑更清晰,也避免了影响现有调用。
示例代码:
// 专门的统计函数 int CountSubstring(string sir1, string sir2) { if (sir2.size() > sir1.size()) return 0; int count = 0; for (int i = 0; i < sir1.size(); ) { int j = 0; if (sir1[i] == sir2[j]) { int k = i; while (j < sir2.size() && i < sir1.size() && sir1[i] == sir2[j]) { j++; i++; } if (j == sir2.size()) { count++; i = k + 1; // 同样可调整重叠/非重叠逻辑 } else { i = k + 1; } } else { i++; } } return count; } // 原函数可以复用统计函数的逻辑,保持原有接口不变 bool SearchString(string sir1, string sir2) { return CountSubstring(sir1, sir2) > 0; }
总结一下
- 如果只是临时需要统计功能,且不担心修改原函数影响现有代码,方案一快速直接;
- 如果统计是长期需求,或者要保持代码的职责清晰,方案二更推荐,还能减少重复代码。
内容的提问来源于stack exchange,提问作者my_name
相关产品推荐
相关产品推荐

