Given two strings s and t, write a function to determine if t is an anagram of s.
For example,
s = "anagram", t = "nagaram", return true.
s = "rat", t = "car", return false.
Note:
You may assume the string contains only lowercase alphabets.
Follow up:
What if the inputs contain unicode characters? How would you adapt your solution to such case?
典型hashtable 问题。
public class Solution {
public boolean isAnagram(String s, String t) {
HashMap<Character, Integer> map = new HashMap<>();
for(char c: s.toCharArray()){
if(map.containsKey(c)){
map.put(c, map.get(c)+1);
}else{
map.put(c, 1);
}
}
for(char c :t.toCharArray()){
if(map.containsKey(c)){
if(map.get(c)==1)map.remove(c);
else map.put(c, map.get(c)-1);
}else{
return false;
}
}
if(map.isEmpty()==true){
return true;
}
return false;
}
}
时间复杂度为O(N),语言无关空间复杂度为O(1)。
看来看论坛,这个问题最好的解法是用Hash array代替Map
public class Solution {
public boolean isAnagram(String s, String t) {
int[] map =new int[26];
for(char c: s.toCharArray()){
map[c-'a']++;
}
for(char c :t.toCharArray()){
map[c-'a']--;
}
for(int e : map){
if(e != 0) return false;
}
return true;
}
}
时间复杂度是一样的,但是时间从50多ms降低到了3ms。