You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

C#不使用Split等方法提取单词并检测连续重复单词

解决C#无Split/Regex提取单词并检测连续重复的问题

嘿,我懂你现在的困扰!你的代码思路方向是对的,但有几个小问题导致它没法正确工作:比如你在还没完成当前单词收集的时候就和前一个单词比较,而且没处理字符串末尾的最后一个单词,也没考虑连续空格的情况。我来帮你修正并解释清楚。

你的代码问题分析

  1. 当你在收集palabra1的过程中(比如正在拼"love"的前两个字母"lo"),就和pal2(之前完整的单词)比较,这时候肯定不相等,完全没必要。
  2. 字符串末尾的单词没有触发比较逻辑(因为最后没有空格进入else分支)。
  3. 连续空格会导致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

火山引擎 最新活动