今天我来给大家分享的是leetcode49的解题思路,题目描述如下
如果没有做过leetcode242题目的同学,可以先把它做了,会更好理解异位词的概念。
本道题的大题思路是:
首先遍历strs,然后统计每一个数组元素出现的次数,之后在用一个标识将它作为key,然后存入map。
我觉得结合代码来理解更好理解。
代码如下:
public List<List<String>> groupAnagrams(String[] strs) {
Map<String,List<String>> map= new HashMap<>();
for (String str : strs) {
int arr[] = new int[26];
for (int i = 0;i<str.length();i++){
arr[str.charAt(i)-'a']++;
}
StringBuffer st = new StringBuffer();
for (int i = 0;i<26;i++){
if (arr[i]!=0){
st.append('a'+i);
st.append(arr[i]);
}
}
String key = st.toString();
List<String> list = map.getOrDefault(key, new ArrayList<String>() );
list.add(str);
map.put(key,list);
}
return new ArrayList<List<String>>(map.values());
}
我们先看第一个for循环,它的目的是统计eat每个字母出现的次数。
然后继续往下走,
第二个for循环的目的是遍历arr,然后并为每个字母打上一个标识,比如eat,经历过这个for循环之后结果就是a1e1t1,并将它作为后续map的key,因为异位词不看顺序只看出现的次数。
然后我们继续往下走,
List<String> list = map.getOrDefault(key, new ArrayList<String>());
这段代码的含义,这个非常重要。
然后将str加入到list中,并将'a1e1t1'
作为map的key,value就是这个list。
如果是字母异位词,那么他们List<String> list = map.getOrDefault(key, new ArrayList<String>());
这里的list应该是同一个list,那么list集合中的数据就是同一组的有效字母异位词。
总体的三步走:
1.统计每个字母出现的次数
2.为每个str赋予一个标识(key)
3.通过这个key看map是否已经有数据。
到此,本题的讲解结束,本道题我建议大家结合代码去看,因为只看思路确实有点思路。