C#不使用Split等方法提取单词并检测连续重复单词
解决C#无Split/Regex提取单词并检测连续重复的问题
嘿,我懂你现在的困扰!你的代码思路方向是对的,但有几个小问题导致它没法正确工作:比如你在还没完成当前单词收集的时候就和前一个单词比较,而且没处理字符串末尾的最后一个单词,也没考虑连续空格的情况。我来帮你修正并解释清楚。
你的代码问题分析
- 当你在收集
palabra1的过程中(比如正在拼"love"的前两个字母"lo"),就和pal2(之前完整的单词)比较,这时候肯定不相等,完全没必要。 - 字符串末尾的单词没有触发比较逻辑(因为最后没有空格进入else分支)。
- 连续空格会导致
pal2被设置为空字符串,干扰后续判断。
修正后的代码
Console.WriteLine("Entra frase"); string frase = Console.ReadLine(); string prevWord = ""; string currentWord = ""; bool hasConsecutiveDuplicates = false; for (int i = 0; i < frase.Length; i++) { // 如果不是空格,继续收集当前单词的字符 if (frase[i] != ' ') { currentWord += frase[i]; } else { // 遇到空格时,先判断当前是否收集到了有效单词(避免连续空格) if (!string.IsNullOrEmpty(currentWord)) { // 和前一个单词比较,检查是否连续重复 if (currentWord.Equals(prevWord, StringComparison.OrdinalIgnoreCase)) { hasConsecutiveDuplicates = true; // 可以提前跳出循环,提高效率 break; } // 更新前一个单词为当前单词,重置当前单词 prevWord = currentWord; currentWord = ""; } } } // 处理字符串末尾的最后一个单词(因为最后没有空格触发else分支) if (!string.IsNullOrEmpty(currentWord)) { if (currentWord.Equals(prevWord, StringComparison.OrdinalIgnoreCase)) { hasConsecutiveDuplicates = true; } } // 输出结果 if (hasConsecutiveDuplicates) { Console.WriteLine($"SI HAY palabras seguidamente repetidas"); } else { Console.WriteLine($"NO HAY PALABRAS REPETIDAS AQUI"); }
关键改进点
- 完整收集单词后再比较:只有当遇到空格(或遍历结束),当前单词完全收集完成时,才和前一个单词对比,确保比较的是完整的单词。
- 处理连续空格:通过判断
currentWord是否为空,避免把连续空格当成空单词去比较。 - 提前终止循环:一旦检测到连续重复单词,直接跳出循环,不用继续遍历,提升效率。
- 忽略大小写(可选):用
StringComparison.OrdinalIgnoreCase可以让"Love"和"love"也被视为重复,如果不需要可以去掉这个参数,用默认的区分大小写比较。 - 处理末尾单词:遍历结束后单独检查最后一个单词,避免遗漏。
测试示例
- 输入:
i love this world love→ 输出NO HAY PALABRAS REPETIDAS AQUI(没有连续重复) - 输入:
i love love this world→ 输出SI HAY palabras seguidamente repetidas(连续重复"love") - 输入:
hello hello world→ 输出SI HAY palabras seguidamente repetidas(连续空格不影响检测)
内容的提问来源于stack exchange,提问作者Andrés Daza




