检查字符串中的字符是否重复

时间:2014-02-26 21:13:00

标签: c#

如何使用C#检查字符或数字是否仅使用一次?

有效:

abcdef

无效:

aabbccddeeff

使用示例:

string stringToTest = "tteesstt0011";
if (OnlyOnceCheck(stringToTest))
{
    throw new Exception("Each character or number can be used only once");
}

7 个答案:

答案 0 :(得分:13)

您可以使用LINQ:

public static bool OnlyOnceCheck(string input)
{
    return input.GroupBy(x => x).Any(g => g.Count() > 1);
}

Distinct

public static bool OnlyOnceCheck(string input)
{
    return input.Distinct().Count() == input.Length;
}

<强>更新

如果有人担心表现,您可以随时使用HasSet<char>

public static bool OnlyOnceCheck(string input)
{
    var set = new HashSet<char>();
    return input.Any(x => !set.Add(x));
}

或者如果您担心委托调用开销,可以使用for循环:

public static bool OnlyOnceCheck(string input)
{
    var set = new HashSet<char>();
    for (int i = 0; i < input.Length; i++)
        if (!set.Add(input[i]))
            return false;
    return true;
}

Any()上的string做了完全相同的事情......

答案 1 :(得分:2)

您可以使用带有字符作为键的映射(例如hashmap)及其出现的值。如果有任何值> 1然后字符串无效。 或者只是在将键添加到map时,如果它已经存在,则该字符串无效。

在C#中

    static bool OnlyOnceCheck(String str){
        Hashtable myHT = new Hashtable();
        for (int i=0; i<str.Length; i++){
            if (!myHT.ContainsKey(str[i])){
                myHT.Add(str[i],1);
            } else return true;
        }
        return false;
    }

对不起我的java编码风格,我没有多久使用C#。

答案 2 :(得分:2)

使用Linq:

public static bool OnlyOnceCheck(string input)
{
    return input.Distinct().Count() == input.Length
}

答案 3 :(得分:1)

我的贡献:

private bool OnlyOnceCheck(string value){
    if (value == null)
        return true;

    for(int i = 0; i < value.length; i++){
         if (value.LastIndexOf(value[i]) != i){
             return false;
         }
    }

    return true;
}

答案 4 :(得分:1)

使用正则表达式:

Console.WriteLine(Regex.IsMatch("abcde", @"(.).*\1")); // False
Console.WriteLine(Regex.IsMatch("abcce", @"(.).*\1")); // True

(.)匹配并捕获任何字符,\1找到同一字符的其他匹配项。

答案 5 :(得分:0)

使用ToCharArray()方法将字符串转换为字符数组,然后循环遍历char [] newStr的值,使用计数器计算每个Char的出现次数。和If ELse声明以评估您的结果

char [] newStr = stringToTest.ToCharArray();

答案 6 :(得分:0)

更有效的方法是从左到右逐个字符地扫描字符串,计算每个字符代码的每个出现次数。一旦你击中了一个已被计数的角色,你可以拒绝整个弦乐;否则整个字符串都会被扫描,其中的每个字符只出现一次。

真正的问题是确定如何跟踪角色数量。如果字符串可以包含任何字符代码(所有65,536个Unicode字符),那么最好使用整数计数的哈希表,由字符代码索引/键入。

另一方面,如果您知道该字符串只包含相当小的字符子集(例如,从'\ u0000'到'\ u00FF'的ISO 8859-1 Latin-1代码),那么您可以使用一个小整数数组来保存计数器。