这道题与cc 150 1.3类似,可以有多种解法,最为方便的一种就是排序,然后检查两个String[]是否相等。时间复杂度为O(nlogn),空间复杂度为O(n),代码如下:
public boolean isAnagram(String s, String t) {
if (s.length() != t.length()) {
return false;
}
char[] str1 = s.toCharArray();
char[] str2 = t.toCharArray();
Arrays.sort(str1);
Arrays.sort(str2);
return Arrays.equals(str1, str2);
}
根据题目中只含有小写字母的性质,我们也可以使用hash table的方法来解决这道题目,注意这里的hash table并不使用Java提供的,而是使用一个长度为26的数组(因为小写字母只有26个),同时也要注意这里的一个技巧,就是使用s.charAt(i) - 'a'来的到当前char所应该在的index,时间复杂度为O(n),空间复杂度为O(1),代码如下:
public class Solution {
public boolean isAnagram(String s, String t) {
if(s == null && t == null) return true;
if(s == null || t == null) return false;
if(s.length() != t.length()) return false;
int[] alphabet = new int[26];
for(int i = 0; i < s.length(); i++) alphabet[s.charAt(i) - 'a']++;
for(int i = 0; i < t.length(); i++) alphabet[t.charAt(i) - 'a']--;
for(int i : alphabet) if(i != 0) return false;
return true;
}
}
知识点:
1. 注意这道题目可以进行扩展为检查一个字符串是否是另一个字符串打乱后的结果,方法与这道题目比较相似,但是确认题目中的编码方式,如果是ASCII的话,那么第二种方法中申请的数组的长度应该为256
2. 记住一个小技巧,就是使用char - ‘a'来得到char相对于'a'的偏差,可以用这种方法方便地获取index
3. 这里首先对两个字符串的长度进行判断,是一种很好的预处理,可以节省很多的时间