什么时候想到用哈希法,当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。
第一题 242.有效的字母异位词
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
ψ(`∇´)ψ 我的思路
- 这是我拿到题一开始的思路,两个字符串装到俩个map中,再进行比较
package hash;
import java.util.HashMap;
import java.util.Set;
class IsAnagram {
public static boolean isAnagram(String s, String t) {
char c;
HashMap<Character, Integer> smap = new HashMap<>();
int len = s.length();//字符串的长度
for (int i = 0; i < len; i++) {
c = s.charAt(i);//挨个取出s字符串中的每一个字符
if(smap.containsKey(c)){//如果key中已有c
smap.put(c,smap.get(c)+1);//把c中原来的值+1再赋给c
} else {
smap.put(c,1);//如果key中没有c,添加c并赋值1
}
}
HashMap<Character, Integer> tmap = new HashMap<>();
for (int i = 0; i < len; i++) {
c = t.charAt(i);//挨个取出t字符串中的每一个字符
if(tmap.containsKey(c)){//如果key中已有c
tmap.put(c,tmap.get(c)+1);//把c中原来的值+1再赋给c
} else {
tmap.put(c,1);//如果key中没有c,添加c并赋值1
}
}
if(smap==tmap){
return true;
}else {
return false;
}
}
public static void main(String[] args) {
String s = "anagram";
String t = "nagaram";
System.out.println(isAnagram(s, t));
}
}
-
后来debug发现==判断的是两个map的地址
-
改进后的思路:只用一个map,第一个字符串存,第二个字符串取
public static boolean isAnagram(String s, String t) {
if(s.length()!=t.length()){
return false;//长度都不等,你还比个什么呢,返回吧
}
char c;
HashMap<Character, Integer> map = new HashMap<>();
int len = s.length();//字符串的长度
for (int i = 0; i < len; i++) {
c = s.charAt(i);//挨个取出s字符串中的每一个字符
if(map.containsKey(c)){//如果key中已有c
map.put(c,map.get(c)+1);//把c中原来的值+1再赋给c
} else {
map.put(c,1);//如果key中没有c,添加c并赋值1
}
}
for (int i = 0; i < len; i++) {
c = t.charAt(i);//挨个取出t字符串中的每一个字符
if(map.containsKey(c)){//如果key中已有c
map.put(c,map.get(c)-1);//把c中原来的值-1再赋给c
if (map.get(c)==0){
map.remove(c);//当c的值减到0的时候移除c
}
} else {
return false;//如果key中没有c,直接返回false
}
}
if(map.isEmpty()){
return true;
}else {
return false;
}
}