【问题标题】:C# What is the speediest technique for IsStringMadeOf method?C# IsStringMadeOf 方法最快的技术是什么?
【发布时间】:2014-10-13 07:59:45
【问题描述】:

我有一个方法被调用了数千次,但目前运行速度很慢。有更好的技术吗?允许使用不安全的方法。

它只是检查输入字符串的字母是否可以由其他字符串的字母组成,就像一个字谜检查器。

这就是我的方法目前的样子。

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

【问题讨论】:

    标签: string c#-4.0 extension-methods


    【解决方案1】:

    首先,您在这里有很多 字符串操作 - 通过每次删除单个字符来创建大量新字符串,并且您正在使用 IndexOf a也很多。

    我会简单地开始非常 - 只需对每个字符串中的字符进行排序,然后查看序列是否相等:

    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;
    }
    

    如果你的字符串很长,那肯定会有很大帮助。对于短字符串,char 数组的创建最终可能会占主导地位……但这至少是我尝试开始的。

    请注意,以上是此 LINQ 版本的略微优化形式:

    public static bool IsStringMadeOf(this string str, string from)
    {
        if (str.Length != from.Length)
        {
            return false;
        }
        return str.OrderBy(c => c).SequenceEqual(from.OrderBy(c => c));
    }
    

    【讨论】:

    • 我忘了说,长度不能相同。 IsStringMadeOf("ABAC", "BNMKLAOBAC") 返回真,...("ABA","ABFDED") 返回假
    • @EmreAtaseven:这确实完全改变了事情......所以你需要第二个字符串中每个字母的足够重复(例如“ABAC”,“ABC”必须返回false)但是第二个字符串可以包含未使用的字母?这确实与我阅读问题的方式完全不同 - 我强烈鼓励您澄清现有问题并确保您将来更清楚地提出问题。如果您能阐明预期的字符串长度以及使用了哪些字符,这也将非常有帮助。 (例如,如果只是 A-Z,那就大不相同了。)
    猜你喜欢
    • 2010-12-23
    • 1970-01-01
    • 2011-10-30
    • 2017-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-23
    • 2020-10-08
    相关资源
    最近更新 更多