C++嵌套循环与字符串查找算法的重复匹配问题
解决重复字符多次匹配的问题
我懂你的困扰啦——这段代码会把目标字符串里所有出现子串的位置都揪出来,哪怕是重叠的重复匹配(比如在"aaa"里找"a",会输出3个位置)。如果你想要调整这个行为,这里有两种常见的修改方案:
方案1:每个目标字符串仅匹配一次
如果你的需求是只要bookVector的某个元素里包含messageVector的子串,就只输出一次(不管它出现多少次),可以把内层的while循环改成单次判断:
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; // 找到一次就停止,不再找当前book元素里的其他匹配 } } }
方案2:跳过重叠匹配
如果你的需求是找到所有不重叠的匹配位置(比如在"aaa"里找"aa",只返回位置0,不返回1),可以把++offset改成offset += messageVector[j].size():
for (int j = 0; j < messageVector.size(); j++) { for (int i = 0; i < bookVector.size(); i++) { size_t offset = 0; const string& target = messageVector[j]; while ((offset = bookVector[i].find(target, offset)) != string::npos) { cout << "Found " << target << " at " << i << "," << offset << std::endl; offset += target.size(); // 跳过当前匹配的整个长度,避免重叠 } } }
原代码的行为解释
原代码里用++offset,意味着每次找到匹配后只往后移动一个字符,所以会捕捉到所有可能的重叠或连续重复的匹配位置。比如在"aaa"中找"a",会依次在0、1、2的位置找到;如果找"aa",会在0和1的位置找到,这就是你遇到重复输出的原因。
内容的提问来源于stack exchange,提问作者SeePlus
相关产品推荐
相关产品推荐

