力扣中567 字符串的排列
直接看题解 人创建了一个数组去计数每个字母的出现次数 然后写了

人家的优化:
每次只更改一两个元素【一进一出】却比对整个数组 所以考虑优化
只创建1个数组 数组里面的个数表示 s1的减去 s2的加上
再创一个变量 diff来记录 cnt1与 cnt2的不同值的个数
s2有和s1相等的子串的时候一定是diff=0的时候
所以每次在滑动窗口加入新元素的时候看如果和旧元素相同不用改变 否则
新加之前如果是0,diff加一 加之后如果是0,diff-1
减之前如果是0,diff加一 减之后如果是0,diff-1
判断diff为0即可说明存在
还有双指针的思路:
设定一个区间 使得s1刚进入时对应计数数组的位置做减法
然后设置左右区间 当数组内有大于0的数 移动左指针让他出去
直至右-左+1等于len1 因为不存在大于零的 元素个数相同 一定是因为都对上了
public static boolean checkInclusion(String s1, String s2) {//s1短 int len1=s1.length(),len2=s2.length(); if(len1>len2) { return false; } int[] count1=new int[26],count2=new int[26]; for(int i=0;i<len1;i++) { count1[s1.charAt(i)-'a']++; } for(int i=0;i<len2;i++) { count2[s2.charAt(i)-'a']++; if(i>=len1) { count2[s2.charAt(i-len1)-'a']--; } if(Arrays.equals(count1, count2)) { return true; } } return false; }
自己写的没写对 但是大体有了滑动窗口的思路 也不想改了 感觉用人家的方法更好 这个放在字典里面不好
public static void main(String[] args) { // TODO Auto-generated method stub String s1="as"; String s2="asdfgh"; System.out.print(Leetcode567.checkInclusion(s1, s2)); } //自己写的是放入一个键值对的map里面 键就是字符char 值就是包含个数 //因为子串的排列相同就是所含个数相同 public static boolean checkInclusion(String s1, String s2) { Map<Character,Integer> map =new HashMap<Character,Integer>(); Map<Character,Integer> map1 =new HashMap<Character,Integer>(); int len=s1.length();; for(int i=0;i<len;i++){ char c = s1.charAt(i); if(map.containsKey(c)) { map.replace(c, map.get(c), map.get(c)+1); } else { map.put(c,1); } } int right=0; for(int i=0;i<s2.length();i++) { for(int j=0;j<s2.length();j++) { char c = s2.charAt(j); while(right-i<len-1) { if(map1.containsKey(c)) { map1.replace(c, map.get(c), map.get(c)+1); } else { map1.put(c,1); } right=right+1; } if(map1.equals(map)) { return true; } else { char ch = s2.charAt(i); if(map1.get(ch)!= 1) {//这块bug 因为不可以和一做比较 因为没有时返回空 map1.replace(ch, map.get(ch)-1); } else { map1.remove(ch); if(map1.containsKey(c)) { map1.replace(c, map.get(c), map.get(c)+1); } else { map1.put(c,1); } right=right+1; } } // map1.replace(s2.charAt(i), map.get(c), map.get(c)+1); } } return false; } }

浙公网安备 33010602011771号