题目描述:
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
思路:使用Map存储前一个字符串的字符的内容,然后与后面的字符串字符内容对比
对map的各种方法操作要很熟悉掌握!
代码:
1)自己使用 Map,出错了
class Solution {
public boolean isAnagram(String s, String t) {
//出现的字符数量是否是对应的
//两个字符串走完,包含的字符数量的一样的
//暴力两层for;哈希表两次for
Map<Character,Integer> map = new LinkedHashMap<>();
for(char c : s.toCharArray()){
if(map.containsKey(c)) map.put(c,map.get(c)++);
else map.put(c,1);
}
for(char c : t.toCharArray()){
if(map.containsKey(c)) map.put(c,map.get(c)--);
else return false;
if(map.get(c) < 0) return false;
}
return true;
/*
for(EntrySet entry : map.getEntry){
if(entry.getValue != 0) return false;
}
return true;
*/
}
}
2)答案的Map使用
class Solution {
public boolean isAnagram(String s, String t) {
if(s.length() != t.length()) return false;
Map<Character,Integer> map = new HashMap<>();
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
map.put(ch, map.getOrDefault(ch, 0) + 1);
}
for (int i = 0; i < t.length(); i++) {
char ch = t.charAt(i);
map.put(ch, map.getOrDefault(ch, 0) - 1);
if (map.get(ch) < 0) {
return false;
}
}
return true;
}
}
3)使用数组作为哈希
class Solution {
public boolean isAnagram(String s, String t) {
//使用下面的方式,需要加这个判定,不然t比s短时,会出错
if(s.length() != t.length()) return false;
int[] res = new int[26];
for(int i = 0;i < s.length();i++){
char c = s.charAt(i);
res[c - 'a']++;
}
for(int i = 0;i < t.length();i++){
char c = t.charAt(i);
res[c - 'a']--;
if(res[c - 'a'] < 0) return false;
}
return true;
}
}
4)使用排序
class Solution {
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);
}
}
4)数组:最快;为什么?
class Solution {
public boolean isAnagram(String s, String t) {
int[] record = new int[26];
for (char c : s.toCharArray()) {
record[c - 'a'] += 1;
}
for (char c : t.toCharArray()) {
record[c - 'a'] -= 1;
}
for (int i : record) {
if (i != 0) {
return false;
}
}
return true;
}
}