给出两个字符串,一个是另一个的字谜

myn*_*neo 6 c#

我刚开始经历"破解编码面试"并针对此问题提供以下解决方案:

public static bool isAnagram(String s, String t)
{
    if (s == "" || t == "") return false;
    else if (s.Length != t.Length) return false;

    int[] letters = new int[256];
    char[] s_array = s.ToCharArray();

    foreach(char c in s_array) 
    { 
        letters[c]++;  
    }

    for (int i = 0; i < t.Length; i++)
    {
        int c = t[i];
        if (--letters[c] < 0) 
        {
            return false;
        }
    }
    return true;
}
Run Code Online (Sandbox Code Playgroud)

这几乎是本书的逐字解决方案,仅限于C#,而不是Java,还有一些额外的nullcheck.我还使用LINQ解决了这个问题,但想要一个不涉及排序的附加解决方案.

这种方法可以变得更优雅吗?代码工作正常,我只是想知道是否有更优雅或更好的解决方案.谢谢!!

Den*_*nko 16

此代码应该适合您:

public static bool IsAnagram(string s1, string s2)
{
    if (string.IsNullOrEmpty(s1) || string.IsNullOrEmpty(s2))
        return false;
    if (s1.Length != s2.Length)
        return false;

    foreach (char c in s2)
    {
        int ix = s1.IndexOf(c);
        if (ix >= 0)
            s1 = s1.Remove(ix, 1);
        else
            return false;
    }

    return string.IsNullOrEmpty(s1);
}
Run Code Online (Sandbox Code Playgroud)

编辑:添加非linq版本.

您还可以为null和empty值添加一些额外的检查,并将解决方案移动到StringBuilder以提高性能,但代码的意图是明确的.