一、哈希表
242.有效的字母异位词
解题思路+代码
没有用哈希表来做。创建一个新的列表来存储26个字母对应的个数。首先判断s和t长度是否一致,不一致直接返回false。接下来,进入循环,每个字母减去’a‘对应的数字为存储这个字母个数的下标,对于s出现的字母--,对于t出现的字母++。最后遍历这个列表,如果其中有值不为0就返回false,如果全部为0,则返回true。
class Solution {
public boolean isAnagram(String s, String t) {
if(s.length() != t.length()){
return false;
}
int[] list1 = new int[26];
for(int i = 0; i < s.length(); i++){
list1[s.charAt(i) - 'a']++;
list1[t.charAt(i) - 'a']--;
}
for(int i = 0; i < 26; i++){
if(list1[i] != 0){
return false;
}
}
return true;
}
}
49.字母异位词分组
解题思路+代码
这道题用hashmap来做,将每个单词排序后的顺序作为key值,判断key值是否已经存在,不存在的话创建新列表,存在的话返回key对应的列表。最后将,加入新单词的key和list放入hashmap。
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
HashMap<String,List<String>> hashmap = new HashMap<String, List<String>>();
for(String str : strs){
char[] array = str.toCharArray();
Arrays.sort(array);
String key = new String(array);
List<String> list = hashmap.getOrDefault(key, new ArrayList<String>());
list.add(str);
hashmap.put(key,list);
}
return new ArrayList<List<String>>(hashmap.values());
}
}
438.找到字符串中所有字母异位词
解题思路+代码
创建两个新的列表分别来存s和p26个字母对应的个数。先判断和p长度相同的s,如果两个列表完全相同的话,则输出list加0。然后采用滑动窗口思想,固定滑动窗口大小,从s的最左边开始,滑动窗口大小为p的长度,每次向右滑动一位,滑动后给滑动前窗口最左边的字母个数减一,给滑动后最右边字母的个数加一,如果这时两个计数列表完全相同的话,则list加上滑动后最左边的位置,即i+1。
class Solution {
public List<Integer> findAnagrams(String s, String p) {
int sLen = s.length(), pLen = p.length();
if(sLen < pLen){
return new ArrayList<Integer>();
}
ArrayList<Integer> list = new ArrayList<Integer>();
int[] scount = new int[26];
int[] pcount = new int[26];
for(int i = 0; i < pLen; i++){
++scount[s.charAt(i) - 'a'];
++pcount[p.charAt(i) - 'a'];
}
if(Arrays.equals(scount, pcount)){
list.add(0);
}
for(int i = 0; i < sLen - pLen ; i++){
--scount[s.charAt(i) - 'a'];
++scount[s.charAt(i + pLen) - 'a'];
if(Arrays.equals(scount, pcount)){
list.add(i + 1);
}
}
return list;
}
}