检查两个字符串是否为字谜的运行时应该是什么

时间:2016-10-01 21:01:10

标签: java runtime permutation anagram

我编写了这个函数,我认为运行时将是O(nlogN),但我并不完全确定。还有,有一种CLEANER方式来编写这个(java)吗?我觉得一个更有经验的程序员可以用更少的代码行来做到这一点。

public static boolean anagramCheck(String strA, String strB){
  if(strA.length() != strB.length()){
  return false;
}

char arrA[] = strA.toCharArray();
char arrB[] = strB.toCharArray();

Arrays.sort(arrA);
Arrays.sort(arrB);

int j = 0;
for(char s : arrA){
    if(s != arrB[j]){
        return false;
    }
     j++;
  }
    return true;
}

2 个答案:

答案 0 :(得分:2)

排序相对昂贵 - O(n log n) - 一般情况下应尽可能避免。

您可以通过对每个字符串进行一次传递来收集字符频率,从而将时间复杂度降低到O(n),然后可以使用Map#equals进行比较。

这只能使用一行来完成:

return strA.chars().boxed().collect(Collectors.groupingBy(i -> i, Collectors.counting()))
  .equals(strB.chars().boxed().collect(Collectors.groupingBy(i -> i, Collectors.counting())));

Try it online

怀疑这段代码确实具有O(n)的时间复杂度,可以看到live timing test显示每个字母的恒定时间 - 即O(n)(其中n是字母中的字长)。

答案 1 :(得分:0)

算法的时间复杂度为O(nlogn)。