使用while循环与搜索算法时重复字符多次输出的问题排查
解决子串重复匹配时多次输出的问题
嘿,我看你遇到的问题是:当bookVector里的字符串包含重复字符(比如"aab"),而messageVector里是单个重复字符(比如"a")时,代码会把所有匹配的位置都打印出来,但这不符合你的预期对吧?
先贴一下你当前的代码方便分析:
for (int j = 0; j < messageVector.size(); j++) { for (int i = 0; i < bookVector.size(); i++) { size_t offset = 0; while ((offset = bookVector[i].find(messageVector[j], offset)) != string::npos) { cout << "Found " << messageVector[j] << " at " << i << "," << offset << std::endl; ++offset; } } }
问题根源
这段代码里的while循环会持续迭代查找:第一次在位置0找到"a"后,offset被更新为1,接着又会从位置1开始继续查找,自然就会找到第二个"a"并再次输出。而你的需求应该是每个字符串中只要找到子串一次就停止,不需要输出所有匹配位置。
解决方案
最简单的修改就是把while循环换成if判断——找到第一个匹配位置后直接输出,然后就终止当前字符串的查找逻辑:
for (int j = 0; j < messageVector.size(); j++) { for (int i = 0; i < bookVector.size(); i++) { size_t offset = bookVector[i].find(messageVector[j]); if (offset != string::npos) { cout << "Found " << messageVector[j] << " at " << i << "," << offset << std::endl; } } }
如果你的需求还有其他细节(比如需要记录所有匹配但只输出一次,或者有其他特殊匹配规则),可以再补充说明,但目前这个修改应该能完美解决你提到的重复打印问题。
内容的提问来源于stack exchange,提问作者SeePlus
相关产品推荐
相关产品推荐

