438. 找到字符串中所有字母异位词
给定两个字符串
s和p,找到s中所有p的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。示例 1:
输入: s = "cbaebabacd", p = "abc" 输出: [0,6] 解释: 起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。 起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。示例 2:
输入: s = "abab", p = "ab" 输出: [0,1,2] 解释: 起始索引等于 0 的子串是 "ab", 它是 "ab" 的异位词。 起始索引等于 1 的子串是 "ba", 它是 "ab" 的异位词。 起始索引等于 2 的子串是 "ab", 它是 "ab" 的异位词。
这种情况窗口大小固定,但也可套用普通滑窗模板,收缩条件为窗口长度,记录条件为当前子串是p的异位词
vector<int> findAnagrams(string s, string p) {
int psize = p.size();
int ssize = s.size();
if(psize>ssize){
return {};
}
string need(26,'0');
string cur(26,'0');
vector<int> ans;
for(char c : p){
int num = c - 'a';
need[num]++;
}
for(int i = 0;i < psize; i++){
int num = s[i] - 'a';
cur[num]++;
}
int left = 0;
int right = p.size()-1;
while(right < s.size()){
if(cur==need){
ans.push_back(left);
}
right++;
if (right == s.size()) break;
int newc = s[right]-'a';
cur[newc]++;
int oldc = s[left]-'a';
cur[oldc]--;
left++;
}
return ans;
}
3. 无重复字符的最长子串
给定一个字符串
s,请你找出其中不含有重复字符的 最长子串的长度。示例 1:
输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。注意 "bca" 和 "cab" 也是正确答案。示例 2:
输入: s = "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。示例 3:
输入: s = "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列, 不是子串。
持续向右扩大窗口,若维护的hashmap的某个值>1,也就是有重复,那就移动左边收缩窗口,直到那个值变回1,并记录此情况。
int lengthOfLongestSubstring(string s) {
unordered_map<char,int> map;
int left = 0;
int right = 0;
int size = s.size();
int length = 0;
while(right < size){//左闭右开
right++;
char c = s[right-1];
map[c]++;
while(map[c]>1){
map[s[left]]--;
left++;
}
length = max(length,right-left);
}
return length;
}