Day 24
题目描述
思路
初次思路:如果两个字符串为异位词,说明它们长度相同并且字母出现的次数相同,于是有以下做法:
- 定义一个map,来保存s中每个字符的出现次数
- 处理特殊情况,如果长度不同,直接返回false
- 从前向后遍历t
- 如果t中的字符出现在map中并且数量大于0,就将数量减一
- 否则直接返回false
- 最后返回true
class Solution {public boolean isAnagram(String s, String t) {Map<Character,Integer>map1=new HashMap<>();if(s.length()!=t.length()){return false;}for(int i=0;i<s.length();i++){if(map1.containsKey(s.charAt(i))){map1.put(s.charAt(i),map1.get(s.charAt(i))+1);}else{map1.put(s.charAt(i),1);}}for(int i=0;i<t.length();i++){if(map1.containsKey(t.charAt(i))&&map1.get(t.charAt(i))>0){map1.put(t.charAt(i),map1.get(t.charAt(i))-1);}else{return false;}}return true;}
}
进阶思路:比较的是两个字符串,那么直接将每个字符串按照字符顺序排序,使用equals比较即可
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);}
}
题目描述
思路
这里是找出所有的异位单词组,做法如下:
- 创建一个map
- 从前向后遍历字符串数组,将每个字符串按照字符排序
- 判断map中是否存在排序后的字符串
- 存在,说明map中已经存在与该字符串互为异位单词,取出map中的字符串数组添加
- 不存在,则创建字符串数组,将该原字符串假如数组,将排序后的字符串和数组加入map
class Solution {public List<List<String>> groupAnagrams(String[] strs) {HashMap<String, List<String>> map = new HashMap<>();for (int i = 0; i < strs.length; i++) {char[] str1 = strs[i].toCharArray();Arrays.sort(str1);if(map.containsKey(String.valueOf(str1))){List<String> list=map.get(String.valueOf(str1));list.add(strs[i]);map.put(String.valueOf(str1),list);}else{List<String> list=new ArrayList<>();list.add(strs[i]);map.put(String.valueOf(str1),list);}}return new ArrayList<>(map.values());}
}