Cracking Coding Interview - 1.2 Check Permutation

Check Permutation: Given two strings,write a method to decide if one is a permutation of the

other.

例子:

1
2
String a = "bbacacege";
String b = "aacbcbeeg";

基本判断

如果两个a.length != b.length,那么return false

排序比较

对两个字符串进行排序,然后比较是否相等

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
public boolean isPermuation(String a, String b) {
  if (a.length() != b.length()) {
    return false;
  }
  String sortedA = quickSort(a);
  String sortedB = quickSort(b);
  for(int i = 0; i < a.length(); i++) {
    if (sortedA.charAt(i) != sortedB.charAt(i)) {
      return false;
    }
  }
  return true;
}

时间复杂度:O(2 * nlogn) + O(n) => O(nlogn)

空间复杂度:O(2 * n) => O(n)

字符计数

如果b是a的permutation,那么b里的各个字符的出现的次数肯定和a一样。如果字符集比较小的话,可以用一个int[]来做记录

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
public boolean isPermutation(String a, String b) {
  if (a.length() != b.length()) {
    return false;
  }
  int[] charCountA = new int[128];
  for(int i = 0; i < a.length(); i++) {
    int pos = a.charAt(i);
    charCountA[pos]++;
  }
  int[] charCountB = new int[128];
  for(int i = 0; i < b.length(); i++) {
    int pos = b.charAt(i);
    charCountB[pos]++;
  }
  for(int i = 0; i < charCountA.length(); i++) {
    if (charCountA[i] != charCountB[i]) {
      return false;
    }
  }
  return true;
}

时间复杂度:遍历了3次,所以是O(3 * n) => O(n)

空间复杂度:两个数组,所以是O(2 * c) > O(c),c=字符集大小

字符计数改进1

可以在遍历b字符串的时候不额外记录字符出现次数,而是直接减掉,最后看是不是为0

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
public boolean isPermutation(String a, String b) {
  if (a.length != b.length) {
    return false;
  }
  int[] charCount = new int[128];
  for(int i = 0; i < a.length; i++) {
    int pos = a.charAt(i);
    charCount[pos]++;
  }
  for(int i = 0; i < b.length; i++) {
    int pos = b.charAt(i);
    charCount[pos]--;
  }
  for(int i = 0; i < charCount.length; i++) {
    if (charCount[i] != 0) {
      return false;
    }
  }
  return true;
}

时间复杂度:同样是O(n)

空间复杂度:少了一个数组,但依然是O(c)

字符计数改进2*

如果a和b的长度一样,但是b不是a的permutation,那么b肯定有一个字符计数比a少,而另一个字符计数比a多,这两个情况是同时出现的,我们只需要看是否b存在一个字符计数比a多。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
public boolean isPermutation(String a, String b) {
  if (a.length != b.length) {
    return false;
  }
  int[] charCount = new int[128];
  for(int i = 0; i < a.length; i++) {
    int pos = a.charAt(i);
    charCount[pos]++;
  }
  for(int i = 0; i < b.length; i++) {
    int pos = b.charAt(i);
    charCount[pos]--;
    if (charCount[pos] < 0) {
      // b比a多了一个字符
      return false;
    }
  }
  return true;
}

字符计数改进3

如果字符集比较大,那么我们可以HashMap来做字符计数

版权

评论