双指针维护无重复字符的区间,更新长度。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
unordered_map<char,int>mp;
int n=s.size();
int ans=0;
for(int i=0,j=0;j<n;j++){
mp[s[j]]++;
while(mp[s[j]]>1){
mp[s[i]]--;
i++;
}
ans=max(ans,j-i+1);
}
return ans;
}
};
字母异位词,长度相等。以目的字符串为长度去原串中遍历,双指针维护长度,cnt数组统计字符出现次数
class Solution {
public:
vector<int> findAnagrams(string s, string p) {
int n=s.size();
int m=p.size();
array<int, 26> cnt_p{};
array<int, 26> cnt_s{};
vector<int>ans;
for(char c:p){
cnt_p[c-'a']++;
}
for(int i=0;i<n;i++){
cnt_s[s[i]-'a']++;
if(i-m+1<0){
continue;
}
if(cnt_p==cnt_s){
ans.push_back(i-m+1);
}
cnt_s[s[i-m+1]-'a']--;
}
return ans;
}
};