567. 字符串的排列
给你两个字符串 s1
和 s2
,写一个函数来判断 s2
是否包含 s1
的排列。如果是,返回 true
;否则,返回 false
。
换句话说,s1
的排列之一是 s2
的 子串 。
示例 1:
输入:s1 = "ab" s2 = "eidbaooo" 输出:true 解释:s2 包含 s1 的排列之一 ("ba").
示例 2:
输入:s1= "ab" s2 = "eidboaoo" 输出:false
提示:
1 <= s1.length, s2.length <= 104
s1
和s2
仅包含小写字母
1 class Solution { 2 public boolean checkInclusion(String s1, String s2) { 3 HashMap<Character, Integer> window = new HashMap<>(); 4 HashMap<Character, Integer> need = new HashMap<>(); 5 for (char c : s1.toCharArray()) { 6 need.put(c, need.getOrDefault(c, 0) + 1); 7 } 8 int left = 0, right = 0; 9 int valid = 0; 10 while (right < s2.length()) { 11 char c = s2.charAt(right); 12 right++; 13 if (need.containsKey(c)) { 14 window.put(c, window.getOrDefault(c, 0) + 1); 15 //包装类需要使用equals判断是否相等 16 if (window.get(c).equals(need.get(c))) 17 valid++; 18 } 19 20 //System.out.println("window: [" + left + "," + right + ")"); 21 22 if (right - left == s1.length()) { 23 if (valid == need.size()) { 24 return true; 25 } 26 char d = s2.charAt(left); 27 left++; 28 if (need.containsKey(d)) { 29 //只有先判断相等valid才能减1 30 if (window.get(d).equals(need.get(d))) 31 valid--; 32 window.put(d, window.get(d) - 1); 33 } 34 } 35 } 36 return false; 37 } 38 }
我偏要勉强!