如何检查字符串是否有超过两个重复字符

4

我将尝试检查一个字符串是否包含超过两个重复字符。

例如:

'aabcd123' = ok
'aaabcd123' = not ok
'aabbab11!@' = ok
'aabbbac123!' = not ok

我尝试过类似的方法,但没有成功。
if (string.Distinct().Count() > 2){ 
                    //do something
                }

任何帮助都将不胜感激。


1
“no luck”是什么意思?这个“if”语句返回了什么?你考虑过使用正则表达式来完成这个任务吗? - Brian
3
为什么 'aaabcd123' 不行?它确实包含超过两个重复字符。 - Cristian Lupascu
2
Distinct() 返回一个包含原始集合中不同元素的集合,而 Count() 只是计算它们的数量。这就是为什么你在那个语句中没有成功的原因。 - Marius Bancila
1
我认为你需要更清楚地表达你所寻找的内容。在我看来,你正在寻找原始字符串中相邻重复字符的子字符串长度不超过2个字符的字符串。这是正确的吗?(我选择这个答案是因为它与你的输入样本匹配...但从你的描述中并不明显这就是你想要的。) - Beska
有人知道为什么我的问题被踩了吗?希望能给我一些建议,告诉我在以后的提问中需要包含哪些内容,以避免被踩。谢谢。 - haydnD
显示剩余3条评论
6个回答

12

这个对我有效:

public bool  IsOK(string s)
{
  if(s.Length < 3) return true;

  return !s.Where((c,i)=> i >= 2 && s[i-1] == c && s[i-2] == c).Any();
}

'aabcd123'     : OK
'aaabcd123'    : not OK
'aabbab11!@'   : OK
'aabbbac123!'  : not OK

这很完美。可以做得更高效,比如避免使用LINQ吗? - Leandro Bardelli
你为什么认为Linq会影响性能呢?是的,你可以将其更改为直接的“while”循环或带有中断条件的“foreach”,但我认为这并不能帮助太多。 - D Stanley
不,你是对的。我已经尝试过了,但没有任何变化。我认为这是由于 "Where" 导致的,因此我试图避免使用 linQ(我正在每秒处理15k个代码)。 - Leandro Bardelli
1
关键在于 Any 一旦找到匹配项就会停止向 Where 请求匹配,因此仅当没有匹配项时才会过滤整个集合。 - D Stanley

8

只是为了经典循环而已:

public bool HasRepeatingChars(string str)
{
    for(int i = 0; i < str.Length - 2; i++)
        if(str[i] == str[i+1] && str[i] == str[i+2])
            return true;
    return false;
}

3
您可以使用正则表达式来完成这个任务:
return Regex.IsMatch(inputString, @"(.)\1{2,}", RegexOptions.IgnoreCase)

这个代码用来检查任何字符,然后检查该字符至少出现了两次。即使是像"AaA"这样的字符串也可以运行,并且可以修改以精确查找这些字符在字符串中的位置等更多信息(还允许您替换这些子字符串为其他内容)。

更多信息:

http://msdn.microsoft.com/zh-cn/library/6f7hht7k.aspx

http://msdn.microsoft.com/zh-cn/library/az24scfc.aspx


1

既然您想在字符串中找到三个字符的连续运行而不仅仅是三个字符,那么您需要循环并查看三个连续字符是否相同。像这样的循环将起作用。

string myString = "aaabbcd";
bool hasMoreThanTwoRepeatingCharsInARow = false;
for(int index = 2; index < myString.Length; index++)
{
  if(myString[index] == myString[index - 1] && myString[index] == myString[index - 2])
  {
    hasMoreThanTwoRepeatingCharsInARow = true;
  }
}

我会将这段代码放入一个方法中,并改进变量名,这样你就可以使用了!

1
    [TestMethod]
    public void Test()
    {
        const string sample1 = "aabcd123";
        const string sample2 = "aaabcd123";
        const string sample3 = "aabbab11!@";
        const string sample4 = "aabbbac123!";

        Assert.IsTrue(IsOk(sample1));
        Assert.IsFalse(IsOk(sample2));
        Assert.IsTrue(IsOk(sample3));
        Assert.IsFalse(IsOk(sample4));
    }

    private bool IsOk(string str)
    {
        char? last = null;
        var i = 1;
        foreach (var c in str)
        {
            if (last == c)
            {
                i++;
                if (i > 2) return false;
            }
            else
            {
                i = 1;
            }
            last = c;
        }
        return true;
    }

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接