我第一次写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
}
答案 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
}