我刚开始经历"破解编码面试"并针对此问题提供以下解决方案:
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以提高性能,但代码的意图是明确的.