算法16.0
算法9.0、算法10.0:用数组构建哈希表的代码
算法11.0 :判断条件要清晰
算法12.0:判断条件的处理 什么时候返回
算法13.0:有关哈希表的知识
算法14.0补充:
hash1统计字符串p中各个字符出现的次数 hash2统计滑动窗口中字符出现的次数
check的步骤的时候 搞一个大小为26的数组充当哈希表 判断操作只需要比较26次即可
这样其实时间复杂度不小 时间复杂度是n
但是这里是一个一个字符 我们构建了一个字符数组,但是有的题目是字符串,此时再比较两个哈希表就非常困难
更新结果的优化:更新结果的判定条件
利用变量count来统计窗口中“有效字符”的个数
还是hash表1 和 hash表2 构建一个变量count
遍历字符串的时候 我们遇到了字母 先拉下来 统计出现的次数
然后和hash表2的字符比较
确认这个是有效字符之后 count+1
然后继续遍历字符串................
一边移动滑动窗口 一边统计有效字符的个数
滑动窗口右移动的时候 要干掉左面的字符(干掉之前先和哈希表的字符比较一下 看这个字符是有效字符 是的话count会更新 )
这样下来我们每次只需要判断count和len是否相等就可以了
class Solution {public List<Integer> findAnagrams(String ss, String pp) {List<Integer> ret = new ArrayList<Integer>();char[] s = ss.toCharArray();char[] p = pp.toCharArray();//构建哈希表int[] hash1 = new int[26];for(char ch:p) hash1[ch-'a']++;int[] hash2 = new int[26];for(int left=0,right=0,count=0;right<s.length;right++){char in = s[right];hash2[in-'a']++;int m = p.length;if(hash2[in-'a'] <= hash1[in-'a']) count++;//进窗口+维护countif(right-left+1 > m){ //判断char out = s[left++];//left++是因为滑出窗口之后 left要移动if(hash2[out-'a'] <= hash1[out-'a']) count--;//出窗口+维护counthash2[out-'a']--; }//更新结果if(count == m) ret.add(left);}return ret;}
}
//xiyu251020&1#2*6//先搞一个数组 用来题目要求的返回 //将字符串转换为数组 ss.toCharArray();// for(char ch:p) hash1[ch-'a']++;
//for each增强for循环 字符串数组ch是临时的 冒号可以读作in
//ch - 'a':将字符 ch 转换为数组索引('a'→0,'b'→1,...,'z'→25)。
//hash1[ch - 'a']++:对应字母的计数器加 1。