(leetcode 76) Minimum Window Substring
??Given a string S and a string T, find the minimum window in S which will contain all the characters in T in complexity O(n).
Input: S = "ADOBECODEBANC", T = "ABC"
Output: "BANC"
string minWindow(string s, string t) {
vector<int> map(128,0);
for(auto c: t) map[c]++;
int counter=t.size(), begin=0, end=0, d=INT_MAX, head=0;
while(end<s.size()){
if(map[s[end++]]-->0) counter--; //in t
while(counter==0){ //valid
if(end-begin<d) d=end-(head=begin);
if(map[s[begin++]]++==0) counter++; //make it invalid
}
}
return d==INT_MAX? "":s.substr(head, d);
}
int findSubstring(string s){
vector<int> map(128,0);
int counter; // check whether the substring is valid
int begin=0, end=0; //two pointers, one point to tail and one head
int d; //the length of substring
for() { /* initialize the hash map here */ }
while(end<s.size()){
if(map[s[end++]]-- ?){ /* modify counter here */ }
while(/* counter condition */){
/* update d here if finding minimum*/
//increase begin to make it invalid/valid again
if(map[s[begin++]]++ ?){ /*modify counter here*/ }
}
/* update d here if finding maximum*/
}
return d;
}
(leetcode 159)Longest Substring with At Most Two Distinct Characters
??Given a string s , find the length of the longest substring t that contains at most 2 distinct characters.
Input: "eceba"
Output: 3
Explanation: tis "ece" which its length is 3.
int lengthOfLongestSubstringTwoDistinct(string s) {
vector<int> map(128, 0);
int counter=0, begin=0, end=0, d=0;
while(end<s.size()){
if(map[s[end++]]++==0) counter++;
while(counter>2) if(map[s[begin++]]--==1) counter--;
d=max(d, end-begin);
}
return d;
}
(leetcode 3)Longest Substring Without Repeating Characters
??Given a string, find the length of the longest substring without repeating characters.
Input: "abcabcbb"
Output: 3
Explanation: The answer is "abc", with the length of 3.
int lengthOfLongestSubstring(string s) {
vector<int> map(128,0);
int counter=0, begin=0, end=0, d=0;
while(end<s.size()){
if(map[s[end++]]++>0) counter++;
while(counter>0) if(map[s[begin++]]-->1) counter--;
d=max(d, end-begin); //while valid, update d
}
return d;
}
(leetcode 567)Permutation in String
??Given two strings s1 and s2, write a function to return true if s2 contains the permutation of s1. In other words, one of the first string‘s permutations is the substring of the second string.
Input: s1 = "ab" s2 = "eidbaooo"
Output: True
Explanation: s2 contains one permutation of s1 ("ba").
bool checkInclusion(string s1, string s2) {
vector<int> map(128, 0);
int counter=s1.size();
int begin=0, end=0;
for(auto c: s1){
map[c]++;
}
while(end<s2.size()){
if(map[s2[end++]]-->0) counter--;
if(counter==0) return true;
if(end-begin==s1.size() && map[s2[begin++]]++>=0) counter++;
}
return false;
}
992. Subarrays with K Different Integers
??Given an array A of positive integers, call a (contiguous, not necessarily distinct) subarray of A good if the number of different integers in that subarray is exactly K.
Input: A = [1,2,1,2,3], K = 2
Output: 7
Explanation: Subarrays formed with exactly 2 different integers: [1,2], [2,1], [1,2], [2,3], [1,2,1], [2,1,2], [1,2,1,2].
int subarraysWithKDistinct(vector<int>& A, int K) {
vector<int> map(A.size()+1, 0);
int begin=0, end=0;
int res=0;
int cnt=0;
int pre_num=0;
while(end<A.size()){
if(map[A[end++]]++==0) cnt++;
if(cnt>K) --map[A[begin++]], cnt--, pre_num=0;
while(map[A[begin]]>1){
map[A[begin++]]--;
pre_num++;
}
if(cnt==K) res+=(1+pre_num);
}
return res;
}
995. Minimum Number of K Consecutive Bit Flips
??In an array A containing only 0s and 1s, a K-bit flip consists of choosing a (contiguous) subarray of length K and simultaneously changing every 0 in the subarray to 1, and every 1 in the subarray to 0.
Return the minimum number of K-bit flips required so that there is no 0 in the array. If it is not possible, return -1.
Input: A = [0,1,0], K = 1
Output: 2
Explanation: Flip A[0], then flip A[2].
int minKBitFlips(vector<int>& A, int K) {
int n=A.size();
int cur=0, res=0;
for(int i=0;i<n;i++){
if(i>=K&&A[i-K]>1){
cur--;
A[i-K]-=2;
}
if(cur%2==A[i]){
if(i+K>n) return -1;
cur++;
A[i]+=2;
res++;
}
}
return res;
}
原文:https://www.cnblogs.com/wangzi199/p/13382123.html