class Solution {
public int lengthOfLongestSubstring(String s) {
//哈希表存储键值对
HashMap<Character, Integer> hs = new HashMap<Character, Integer>();
//包含元素【i】的字符串下表
int containIndex = 0;
//子串的最左边下表
int leftIndex = 0;
int result = 0;
for (int i=0;i<s.length();i++){
//有重复
if (hs.containsKey(s.charAt(i))){
//找到子串中存在的位置
containIndex = hs.get(s.charAt(i));
//滑动窗口左边
leftIndex = Math.max(leftIndex,containIndex+1);
}
//不管有没有重复,都得向前滑动一个窗口
hs.put(s.charAt(i),i);
//记录每一次窗口的大小,选取每一次的最大值
result = Math.max(result,i-leftIndex+1);
}
return result;
}
}
class Solution {
public List<Integer> findAnagrams(String s, String p) {
List<Integer> result = new ArrayList<>();
int slen = s.length();
int plen = p.length();
if (slen<plen) return result;
int[] pCount = new int[26];
for (int i=0;i<plen;i++){
pCount[p.charAt(i)-'a']++;
}
int left = 0;
int right = 0;
for (right=0;right<slen;right++){
pCount[s.charAt(right)-'a']--;
//用while循环是因为存在p:abc,子串是:abbbbc这种情况
while(pCount[s.charAt(right)-'a']<0){
//从左侧收缩窗口,直到当前字符在限定范围里面【还原之前减去的计数数组】
pCount[s.charAt(left)-'a']++;
left++;
}
if (right-left+1==plen){
result.add(left);
}
}
return result;
}
}