我有一个被称为数千次的方法,但它目前运行起来很慢。有更好的技术吗?允许使用不安全的方法。
它只是检查输入字符串的字母是否可以由其他字符串的字母组成,如字谜检查器。
这是我目前的方法。
public static bool IsStringMadeOf(this string str, string from)
{
for (int i = 0; i < str.Length; i++)
{
int index = from.IndexOf(str[i]);
if (index != -1)
{
from = from.Remove(index, 1);
}
else
{
return false;
}
}
return true;
}
对于我的测试用例,结果应如下:
str | from | result
-------------------------------
SLOW | WSOL | true
SLOW | WTOL | false
ASIA | XZYABSTRIB | false
ASIA | XZYABSTRIAB | true
答案 0 :(得分:3)
首先,你在这里有一个很多的字符串操作 - 你通过每次删除一个字符来创建许多新字符串,并且你正在使用{{1}很多。
我会简单地开始非常 - 只需对每个字符串中的字符进行排序,然后查看序列是否相等:
IndexOf
如果你有很长的琴弦,这肯定会有很大的帮助。对于短字符串,public static bool IsStringMadeOf(this string str, string from)
{
if (str.Length != from.Length)
{
return false;
}
char[] strArray = str.ToCharArray();
char[] fromArray = from.ToCharArray();
Array.Sort(strArray);
Array.Sort(fromArray);
for (int i = 0; i < strArray.Length; i++)
{
if (strArray[i] != fromArray[i])
{
return false;
}
}
return true;
}
数组的创建可能最终占据主导地位......但这至少是我尝试开始的。
请注意,以上是此LINQ版本的略微优化形式:
char