[leetcode]438. 找到字符串中所有字母异位词
Link
class Solution { public List<Integer> findAnagrams(String S, String P) { char[] s = S.toCharArray(), p =P.toCharArray(); int n = s.length, m = p.length; Map<Character,Integer>mp1 = new HashMap<>(); Map<Character,Integer>mp2 = new HashMap<>(); for(char c:p){ mp1.put(c,mp1.getOrDefault(c,0) + 1); } int tar = mp1.size(); int l = 0, r = 0; int cnt = 0; List<Integer>res = new ArrayList<>(); while(r < n){ char c = s[r++]; mp2.put(c,mp2.getOrDefault(c,0) + 1); if(mp2.get(c).equals(mp1.get(c))){ cnt++; } while(r - l > m){ c = s[l++]; if( mp2.get(c).equals(mp1.get(c))) cnt--; mp2.put(c,mp2.get(c) - 1); } if(cnt == tar){ res.add(l); } } return res; }}
这题就是一个简单的定长滑动窗口,但是不要c++写习惯了 java中的HashMap需要用包装类作为泛型,Integer
是一个对象,所以==
是比较地址
在两个if判断中
if(mp2.get(c).equals(mp1.get(c)))
必须用equals方法,而不是==,equals才是比较两个Integer的值相等