Article Directory
topic
Given two strings s and t, write a function to determine whether t is an anagram of s.
Example 1:
输入: s = "anagram", t = "nagaram"
输出: true
Example 2:
输入: s = "rat", t = "car"
输出: false
Description:
You can assume that the string contains only lowercase letters.
Advanced:
What if the input string contains unicode characters? Can you adjust your solution to deal with this situation?
Solution 1: Sort
/**
* 思路:
* 简单过滤:看两个字符串长度是否一致
* 转换成字符数组
* 排序
* 比较数组
*/
public boolean isAnagram(String s, String t) {
if (s.length()!=t.length())return false;
char[] s1 = s.toCharArray();
char[] t1 = t.toCharArray();
Arrays.sort(s1);
Arrays.sort(t1);
return Arrays.equals(s1,t1);
}
Time complexity: Onlogn
Space complexity: On
Solution 2: Array
/**
* 思路:
* 简单过滤:看两个字符串长度是否一致
* 数组长度26,代表26个字母
* 遍历s和t,s中的字母在数组上++,t中的字母--
* 最后遍历数组,如果有不是0的就不为有效字母异位词
*/
public boolean isAnagram(String s, String t) {
if (s.length()!=t.length())return false;
int[] arr=new int[26];
for (char c:s.toCharArray()){
arr[c-'a']++;
}
for (char c:t.toCharArray()){
arr[c-'a']--;
}
for (int i:arr)if (i!=0)return false;
return true;
}
Time complexity: On
Space complexity: O1
Solution 3: HashMap
/**
* 思路:
* 简单过滤:看两个字符串长度是否一致
* map中存放26个字母,以及出现的次数
* s中出现++,t中出现--
* 最后看map中的每个key的value是否为0
*/
public boolean isAnagram(String s, String t) {
if (s.length()!=t.length())return false;
HashMap<Character, Integer> map = new HashMap<>();
for (char c='a';c<='z';c++)map.put(c,0);
for (int i=0;i<s.length();i++){
map.put(s.charAt(i),map.get(s.charAt(i))+1);
map.put(t.charAt(i),map.get(t.charAt(i))-1);
}
for (int i:map.values())if (i!=0)return false;
return true;
}
Time complexity: On
Space complexity: On
Solution 4: HashMap (violence)
/**
* 思路:
* 将字符串转换为字符数组
* 存储每个字符的次数在map中
* 对比map中的数是否相同
*/
public boolean isAnagram(String s, String t) {
HashMap<Character, Integer> s_map = new HashMap<>();
HashMap<Character, Integer> t_map = new HashMap<>();
char[] s_chars = s.toCharArray();
char[] t_chars = t.toCharArray();
for (char c:s_chars){
if (s_map.containsKey(c)) {
s_map.put(c, s_map.get(c) + 1);
}else {
s_map.put(c, 1);
}
}
for (char c:t_chars){
if (t_map.containsKey(c)) {
t_map.put(c, t_map.get(c) + 1);
}else {
t_map.put(c, 1);
}
}
if (s_map.size()!=t_map.size())return false;
for (Character c:s_map.keySet()){
if (!t_map.containsKey(c)||!s_map.get(c).equals(t_map.get(c)))return false;
}
return true;
}
Time complexity: On
Space complexity: On