检查重复char上的字符串

时间:2014-02-15 06:47:14

标签: c# string duplicates

我第一次写SO,因为他自己找不到解决方案。 在采访中,我被赋予了编写一个方法来检查字符串中的字符是否唯一的任务。

要求不使用LINQ 理想:不要使用其他数据类型(Dictionary,HashSet等。数组和列表允许

示例:

"Hello" - return false; "Helo" - return true

我的实施:

static HashSet<char> charSet = new HashSet<char>();

static bool IsUniqueChar(string str)
{       
    foreach (char c in str)
    {            
           charSet.Add(c);                         
    }
    return charSet.Count() == str.Length;
}

但它不符合数据类型的要求,并不是最佳性能...... 我也用字典试过这个方法:

static Dictionary<char,bool> charSetDictionary = new Dictionary<char,bool>();

static bool IsUniqueChar(string str)
{
    try
    {
        foreach (char c in str)
        {
            charSetDictionary.Add(c,true);
        }
    }
    catch 
    {
        return false;
    }

但他并不比以前更好。 我会欢迎任何想法如何更好地解决这个任务? P.S

static void Main(string[] args)
{
    Stopwatch sw = Stopwatch.StartNew();

    IsUniqueChar("Hello");

    sw.Stop();

    Console.WriteLine("Elapsed={0}", sw.Elapsed); //~005044
}

4 个答案:

答案 0 :(得分:8)

最快的方法是使用HashSet<char>

var set = new HashSet<char>();

foreach(var c in input)
{
    if(!set.Add(c))
        return false;
}

return true;

在最坏的情况下,它是 O(n)解决方案(输入是唯一的)。找到第一个副本后立即返回false

如果没有HashSet<char>,您可以轻松地将string转换为char[],对其进行排序并检查您是否有两个具有相同值的连续项。

var chars = input.ToCharArray();
chars.Sort();

for(int i = 1; i < chars.Length; i++)
{
    if(chars[i-1] == chars[i])
        return false;
}

return true;

Sort O(n log(n)),整个函数也是如此。

答案 1 :(得分:1)

到目前为止,所有答案都是基于一个.NET char对应一个Unicode 字符的假设。这仅适用于Basic Multilingual Plane中的字符。 BMP之外的字符使用两个 char个对象(代理对)进行编码。

以下代码处理此特例:

HashSet<string> set = new HashSet<string>();

for (int i = 0; i < str.Length; i++)
{
    string s;
    if (char.IsHighSurrogate(str[i]))
    {
        s = str.Substring(i, 2);
        i++;
    }
    else
    {
        s = str.Substring(i, 1);
    }

    if (!set.Add(s))
    {
        return false;
    }
}
return true;

答案 2 :(得分:0)

假设测试字符串通过 textBox1 传递,然后是:

string tst;
int i,j, stat =0;
tst = textBox1.Text;
for (i = 0; i < tst.Length; i++)
{
    for (j = 0; j < tst.Length; j++)
    {
        if ((tst[i] == tst[j]) && (i != j))
        {
            stat = 1;
            break;
        }
        else continue;
    }
    if (stat == 1) break;
    else continue;
}
if (stat == 1) MessageBox.Show("False");
else MessageBox.Show("True");

每个字符串都是一个字符数组。

答案 3 :(得分:-1)

最有可能的是,您的面试官希望看到一种使用Unicode知识的方法:

static bool[] charsHash = new bool[512];

static bool IsUniqueChar(string str)
{
    if (str.Length > 512) return false;

    foreach (char c in str)
    {
        bool alreadyExist = charsHash[(int)c];
        if (alreadyExist) return false;
        else charsHash[(int)c] = !alreadyExist;
    }
    return true;
}

static void Main(string[] args)
{
    Stopwatch sw = Stopwatch.StartNew();

    IsUniqueChar("Hello");

    sw.Stop();
    Console.WriteLine("Elapsed={0}", sw.Elapsed);//~000283
}