leetcode题目地址:242. 有效的字母异位词
代码随想录题解地址:代码随想录
给定两个字符串 s
和 t
,编写一个函数来判断 t
是否是 s
的字母异位词。
注意:若 s
和 t
中每个字符出现的次数都相同,则称 s
和 t
互为字母异位词。
1. 主要是对HashMap和HashSet之类的java类还不太熟悉
2. 第一反应是用HashMap,
public boolean isAnagram(String s, String t) {
HashMap map = new HashMap<>();
HashMap map2 = new HashMap<>();
for (String i : s.split("")){
if (map.containsKey(i) == false){
map.put(i, 1);
}else{
int temp = map.get(i);
temp++;
map.replace(i,temp);
}
}
for (String i : t.split("")){
if (map2.containsKey(i) == false){
map2.put(i, 1);
}else{
int temp = map2.get(i);
temp++;
map2.replace(i,temp);
}
}
boolean check = true;
if (map.size() != map2.size()) return false;
Set set1 = map.keySet();
Object[] arr1 = set1.toArray();
Arrays.sort(arr1);
Set set2 = map2.keySet();
Object[] arr2 = set2.toArray();
Arrays.sort(arr2);
for (int i = 0; i < map.size(); i++){
String key1 = (String)arr1[i];
String key2 = (String)arr2[i];
int val1 = map.get(key1);
int val2 = map2.get(key2);
if (key1.equals(key2) == false || val1 != val2){
check = false;
break;
}
}
// 遍历print HashMap元素
// Iterator iterator = map.keySet().iterator();
// while (iterator.hasNext()){
// String key = (String)iterator.next();
// System.out.println(key+"="+map.get(key));
// }
// System.out.println(map.size()); //显示HashMap长度
return check;
}
1. HashMap的key值是无序的,需要将key序列转换为set,再转换为array,再排序,才能有序。
网上处理key序列无序方法:
将entrySet转换为List,然后重写比较器比较即可.这里可以使用List.sort(comparator),也
可以使用Collections.sort(list,comparator)。
【解题思路】
数组解法:定义一个长度为26的数组,依次代表 a~z,每个元素值代表某字符出现的次数;对于第二个数组,对出现频率做对应减法,最终数组每一个元素值都为0,则为异位词。
【想法】
1. 哈希题常用的3种数据结构:
数组(适用于哈希值比较小,范围可控)、
set(适用于hash值很大)、
map(适用于key-value)。
public boolean isAnagram(String s, String t) {
int[] sites = new int[26];
for (int i = 0; i < s.length(); i++){
sites[s.charAt(i)-97]++;
}
for (int i = 0; i < t.length(); i++){
sites[t.charAt(i)-97]--;
}
for (int i : sites){
if (i != 0) return false;
}
return true;
}
9:05 ~ 10:13 解题成功
9:31 ~ 11:03 看视频题解、写博客
1. HashMap的key值是 无序 的,需要将key序列转换为set,再转换为array,再排序,才能有序。
2. 一些类的写法、作用和注意事项:
HashMap
ArrayList
int[] sites = new int[26]; //只有该数组不能用 [index]下标
Iterator iterator = map.keySet().iterator(); //迭代器
while (iterator.hasNext()){ //判断next是否为空
String key = (String)iterator.next(); //遍历next元素
}
Set set1 = map.keySet(); //将HashMap的key值序列转换成Set
Object[] arr1 = set1.toArray(); //Set转换成列表
Arrays.sort(arr1); //数组才能排序
key1.equals(key2) //字符串比较
3. HashMap方法:
Map
HashMap
map.containsKey(i); hashMap.containsValue(1);
map.put(i, 1); map.putIfAbsent("aa",4);
map.get(i);
map.keySet(); map.values()
map.size();
map.remove("bb"); map.replace(i,temp);
遍历:
Map
for (Map.Entry
System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}
4. ArrayList方法【略】:
sites.add("Google");
5. 'a'的ASCII码为97。
6. String转char:
1. 使用String.charAt(index)(返回值为char)可以得到String中某一指定位置的char。
2. 使用String.toCharArray()(返回值为char[])可以得到将包含整个String的char数组。
Char转String:
1. String s = Character.toString('c'); //方式太多,略
7. 求String长度:str.length() 求数组长度:arr.length
8. int类型可以迭代。