These questions are very important for contests . The first question is always a string question where you have to generate subarray. For arrays, questions from PREFIX sum comes often
@AyushEditz-hs6pf2 ай бұрын
easy solution using the generic sliding window that we have used till here. Striver's solution is the best though: TC= O(2N log3) at worst SC=O(3) int n = s.length(); int left = 0 ; int right = 0; int counter=0; map mpp; while( right < n){ mpp[s[right]]++; while(mpp.size() ==3){ counter+= n - right; mpp[s[left]]--; if(mpp[s[left]]==0) mpp.erase(s[left]); left++; } right++; } return counter;
@sauravkumar-ln7zh5 ай бұрын
i did this question based on the logic based on previous question → We need to monitor every character in the sliding window. → For this, we use a map to keep track of the number of each character present in the sliding window. → If the number of distinct characters exceeds k, we start removing characters from the back until the size of the map is less than or equal to k. → If the count of a certain character becomes zero while removing it from the back, we must erase it from the map to decrease the map's size. class Solution { public: int plzhelp(string s, int k) { int i = 0; int j = 0; unordered_map mp; int count = 0; while (j < s.length()) { mp[s[j]]++; while (mp.size() > k) { mp[s[i]]--; if (mp[s[i]] == 0) { mp.erase(s[i]); } i++; } count += (j - i + 1); j++; } return count; } int numberOfSubstrings(string s) { int k = 3; int count = plzhelp(s, k) - plzhelp(s, k - 1); return count; } };
@sauravdhar16965 ай бұрын
can you explain why you did => int count = plzhelp(s, k) - plzhelp(s, k - 1) ??
@Rahul_Mongia5 ай бұрын
@@sauravdhar1696 kyo ki plzhelp(s,k) will return all substring having characters
@bhargav.v.m.1934 ай бұрын
@@Rahul_Mongia can this be avoided by making count += (j - i + 1); j++; to if(mpp(mp.size() == k){ count += (j - i + 1); } j++;
@MaheshPatil-of1zy3 ай бұрын
But Bro what is the guarantee that the the function you have written return the characters having only a,b,c which obvious count to because it may also return the count having aaa,aab,bba etc. does you have to say something.?
@UECSoumyaRay2 ай бұрын
When you are writing "count += (j-i+1)" you are still using the SAME MINIMUM WINDOW CONCEPT. Earlier (j-i+1) used to signify the length of the substring, now it signifies the number of substrings(excluding the ones that have already been counted)
@namannema33497 ай бұрын
i hope striver one day i will build logic like you
@2amCoder7 ай бұрын
the reason you were good at cp. i tried many things with this solution but none of them were close good as this last explanation
@dipanshuraj7868Ай бұрын
The bruteforce approach I do is class Solution { public: int numberOfSubstrings(string s) { int count = 0; for(int i = 0; i
@mayank_singh_435 ай бұрын
This problem of counting substring and subarrays always confused me in any contest , now I learned the concept of how to do this. THanks a lot striver bhaiya
@ManishKumar-dk8hl7 ай бұрын
optimal :- class Solution { public int numberOfSubstrings(String s) { int len=0; int r=0; int[] arr=new int[3]; Arrays.fill(arr,-1); while(r
@rajalakshmis73087 ай бұрын
Thank you, Striver. Before watching this video, I just solved it using your previous lecture pattern. But, the approach you used is the best among all. import java.util.HashMap; public class Solution { public static int countSubstring(String s){ // Write your code here. // to find the tot subarray count int res = s.length()*(s.length()+1)/2; // return tot subarray - subarray which has atmost any 2 characters from a,b,c. return res-solve(s); } // function to find a subarray which has atmost any 2 character from a,b,c public static int solve(String s){ HashMap map = new HashMap(); int left=0,count=0; for(int right=0;right2){ map.put(s.charAt(left), map.get(s.charAt(left))-1); if(map.get(s.charAt(left))==0) map.remove(s.charAt(left)); left++; } count+=right-left+1; } return count; } }
@surendharv7954 ай бұрын
Your Solution is good , but it is failing in the 48 th test case in leetcode.
@kartikluthra66213 ай бұрын
@@surendharv795 you need to use long becuase integer might overflow for larger tc
@saurabhchaudhari41574 ай бұрын
//Another Optimized Approach class Solution { public: int numberOfSubstrings(string s) { int n=s.length(); int cnt=0; int left=0; int right=0; unordered_mapmpp; while(right
@arnabsarkar5245Ай бұрын
I did it using this way
@KhushiVerma-y6t6 ай бұрын
I was not able to understand this question's approach but you have done it :)
@ammarhasan702 ай бұрын
not watching the video i come to say i have done this question by myself with help of previous teaching thank u striver
@LinhHoang-ml1qoАй бұрын
Understood, thank you Striver!
@dhruvsandhu28262 ай бұрын
Another approach can be ans=all possible substring - string that contain a,b and c together all possible substring = n(n+1)/2 and later one is easy to find using 2 pointers approach
@shivamkaushik1163Ай бұрын
class Solution: def numberOfSubstrings(self, s: str) -> int: a=-1 b=-1 c=-1 count=0 for i in range (len(s)): char=s[i] if char=='a': a=i if char=='b': b=i if char=='c': c=i if a!=-1 and b!=-1 and c!=-1: count+=min(a,b,c)+1 return count
@ratishjain27187 ай бұрын
insane approach
@Adarsh-fg5gs6 ай бұрын
i did somewhat diffrent as TOtal no of subarrays - subarrays with at most 2 distinct characters and it becomes same as previous question int countSubstring(string s) { //Total no of subarrays with n characters =n(n+1)/2 int n=s.size(); int total=n*(n+1)/2; //now write code to find for at most 2 distinct characters int acnt=0,bcnt=0,ccnt=0,res=0,l=0,r=0; while(r0 && bcnt>0 && ccnt>0){ if(s[l]=='a')acnt--; if(s[l]=='b')bcnt--; if(s[l]=='c')ccnt--; l++; } res+=(r-l+1); r++; } return total-res; //total no of subarrays-subarrys with at most two distinct }
@charchitagarwal5892 ай бұрын
How does res+=(r-l+1); gives u all the substrings, this way we used to calculate maxlen
@prajwal58172 ай бұрын
i came to this same solution as well
@shreyxnsh.14Ай бұрын
Almost same: My solution: class Solution { public: int numberOfSubstrings(string s) { int count = 0; int l = 0, r = 0; int acount = 0, bcount = 0, ccount = 0; while(r < s.size()){ if(s[r]=='a') acount++; else if(s[r]=='b') bcount++; else ccount++; if(acount>0 && bcount>0 && ccount > 0){ int x = 0; while(acount>0 && bcount>0 && ccount>0){ if(s[l]=='a') acount--; else if(s[l]=='b') bcount--; else ccount--; // count++; x++; l++; } count+=(s.size() - r) * x; // l++; } r++; } return count; } }; what will be the complexity of this tho? O(N) or O(2N)?
@manansanghani103217 күн бұрын
i used a map but yeah since size is at max 3 , it wont be a problem
@rushidesai28363 ай бұрын
This solution is ingenius.
@techyguyaditya7 ай бұрын
This took a bit of time to understand for optimal approach. I was literally trying to derive mathematical formula which only passes the test case shown in video, further optimizing the code. But the edge case is that, L may not update in other test cases. Basic approach: Find left value of minimum sliding window in each iteration (start finding once a,b,c gets it's value other than -1). Then basically, for each iter, ctr += 1 + L (where L is leftmost index of window, min(a,b,c)). Striver said to omit if statement, because 1 + (-1) = 0. I disagree with that, because if you see low level programming, the unnecessary write operation happens to the memory even if the value remains the same. Write operations are generally considered as costly operation. Even if it's for 1 extra line of code, it will prevent the costly write operation just by having read operation, further optimizing the code.
@hashcodez7573 ай бұрын
"UNDERSTOOD BHAIYA!!"
@rlm32275 ай бұрын
The optimised solution is a very clever sol
@tradester66993 ай бұрын
class Solution { public: int numberOfSubstrings(string s) { int n = s.size(); int ans = 0; vector arr(3,-1); for(int i=0; i
@rider55844 ай бұрын
here is the java code = class Solution { public int numberOfSubstrings(String s) { // Array to store the latest positions of characters 'a', 'b', and 'c' int[] latestPosition = new int[] {-1, -1, -1}; // This will hold the count of valid substrings int answer = 0; // Iterate over each character in the string for (int i = 0; i < s.length(); ++i) { char currentChar = s.charAt(i); // Update the latest position of the current character latestPosition[currentChar - 'a'] = i; // Find the smallest index among the latest positions of 'a', 'b', and 'c' // and add 1 to get the count of valid substrings ending with the current character int minPosition = Math.min(latestPosition[0], Math.min(latestPosition[1], latestPosition[2])); answer += minPosition + 1; } return answer; // Return the total count of valid substrings } }
@jitinroy2246Ай бұрын
thanks mate.
@kunalgupta34328 күн бұрын
Great Explanation!!
@cheezy_cheez6 ай бұрын
best explanation! especially the part where you mentioned why even omiting the if checking would be ok, I was bamboozled haha
@PogalaHarshitha25 күн бұрын
thank you bhayya
@moonlight-td8ed5 ай бұрын
mind blown dude... crazy optimal soln
@nihalsingh62332 ай бұрын
int numberOfSubstrings(string s) { int count = 0; int left = 0; int right = 0; int size = s.size(); unordered_mapmp; while(right < size) { mp[s[right]]++; while(mp.size() == 3) { count += size - right; mp[s[left]]--; if(mp[s[left]] == 0) mp.erase(s[left]); left++; } right++; } return count; }
@aamna52438 ай бұрын
bhai farishta h tu.
@ayanahmad128 ай бұрын
Literally 🔥✅
@PawanKumar-tj2xk5 ай бұрын
@@ayanahmad12 simp
@Sankalp-sd6fm3 ай бұрын
@@ayanahmad12 simp
@MohdYaqoob-s3k2 ай бұрын
this was a tough one
@expanse88464 ай бұрын
Another solution using previous video method class Solution { public: int numberOfSubstrings(string s) { vectorhashh(3,0); int l=0,r=0,n=s.size(); int ct=0; // vectordis; while(r0 && hashh[1]>0 && hashh[2]>0) { ct+= n-r; hashh[s[l]-'a']--; // dis.push_back(ct); l++; } r++; } // for(int i=0;i
@LockingIn80082 ай бұрын
class Solution { public: int numberOfSubstrings(string s) { int n = s.length(); int l=0; int r=0; int cnt = 0; unordered_map mpp; //character and its frequency while(r=3){ cnt = cnt + (n-r); mpp[s[l]]--; if(mpp[s[l]]==0) mpp.erase(s[l]); l++; } if(mpp.size()
@Arya200127 ай бұрын
what a grate solution,just love this,thank u brother
@saakshishekhar2378 ай бұрын
int numberOfSubstrings(string s) { vector lastSeen(3,-1); int cnt = 0; for(int i=0; i
@sakethsenapathi83238 ай бұрын
i didnt get what is lastseen[s[i] - 'a'] = i part can u please explain.
@ManishKumar-dk8hl7 ай бұрын
@@sakethsenapathi8323 s[i] character represent kr raha h aur jb unme 'a' minus hoga too a-a=0 ; b-a=1 ;c-a =2 ayega then lastseen wali array k index pr string k character ka index store hoyega . index 0 of array=a, index 2= b,index 2=c
@KratiGarg-ue1ph6 ай бұрын
I tried the approach you gave in the binary subarray question (number of total subarrays(n*(n+1)/2) - the subarrays where mapcount < 3. that also worked. Please give tips on how to approach a question like this!
@oyeesharme3 ай бұрын
understood bhaiya
@ganeshjaggineni40974 ай бұрын
NICE SUPER EXCELLENT MOTIVATED
@omkarsawant92675 ай бұрын
#include #include #include #include using namespace std; // Function to count the number of substrings containing all three characters 'a', 'b', and 'c' pair numberOfSubstrings(string s) { // Hashmap to store the count of 'a', 'b', and 'c' in the current window unordered_map count; int left = 0, result = 0; vector substrings; // Iterate over the string with 'right' as the end of the window for (int right = 0; right < s.length(); ++right) { // Increment the count of the current character count[s[right]]++; // Check if all three characters are present in the current window while (count['a'] > 0 && count['b'] > 0 && count['c'] > 0) { // If yes, add all possible substrings starting from the current 'left' to 'right' result += s.length() - right; // Capture the substrings for (int k = right; k < s.length(); ++k) { substrings.push_back(s.substr(left, k - left + 1)); } // Move the left end of the window to the right count[s[left]]--; left++; } } return {result, substrings}; } int main() { string s = "abcabc"; auto result = numberOfSubstrings(s); cout
@akay57974 ай бұрын
Mindblown
@subee1288 ай бұрын
Thanks
@akashgite9057 күн бұрын
just small mistake in Brute force solution in if condition insted of adding them check if there all frq are greater than 0 if(hash[0] >0 && hash[1] >0 && hash[2] >0) { count++; }
@niladri_c2 ай бұрын
My own O(2n) soln. class Solution { public: int numberOfSubstrings(string s) { // better approach // sliding window // let's see if it works. // taking the variables int n = s.length(); int l = 0, r = 0, cnt = 0, a = 0, b = 0, c = 0; //checking from start to end while(r < n){ if(s[r] == 'a') a++; if(s[r] == 'b') b++; if(s[r] == 'c') c++; // if for a r and l, a >= 1, b >= 1, c >= 1, then for all following r and fixed l, the substring is valid while(a>=1 && b>=1 && c>=1){ //we are checking till the l for which condition is valid, for that, we don't need to increase r, and add (n - r) to count for each while cnt += (n - r); if(s[l] == 'a') a--; if(s[l] == 'b') b--; if(s[l] == 'c') c--; l++; } r++; } return cnt; } };
@KrishnaChauhan-fo4ky28 күн бұрын
class Solution { public: int numberOfSubstrings(string str) { int hash[256];fill(hash,hash+256,0); int s=0,k=0,count=0; int a='a',b='b',c='c'; while(k
@nirbhaysingh79718 ай бұрын
#include int countSubstring(string s){ // Write your code here. int n = s.size(); int left = 0; int right = 0; map mpp; int cnt = 0; while(right
@ujjwalkashyap91968 ай бұрын
Please update the site also with all the upcoming videos 🙏
@AkOp-bf9vm4 ай бұрын
the line if(hash[0]!=-1 && ...) is not compulsory, the code will work fine without this line because -1+1=0 and if 0 is added to Count it didn't impact the answer
@shashankvashishtha44544 ай бұрын
understood
@sunitsable27526 ай бұрын
amazing logic!!!
@glorious_purp_1236 ай бұрын
Outstanding
@RonitTejani5 ай бұрын
Legit God
@animexworld66148 ай бұрын
My question is what is your favorite colour
@adityapandey234 ай бұрын
Understood
@sobhansahoosubh38735 ай бұрын
we also do like this way int numberOfSubstrings(string s) { int n = s.size(); int l = 0,r = 0,count = 0; unordered_map mp; while(r < n) { mp[s[r]]++; while(mp['a'] >= 1 && mp['b'] >= 1 && mp['c'] >= 1 ) { count = count + (n - r); mp[s[l]]--; l++; } r++; } return count; }
@codeman38287 ай бұрын
Understood. great
@karthik-varma-15792 ай бұрын
class Solution { public int numberOfSubstrings(String s) { int n = s.length(); int l=0,r=0,count=0; int lastSeen[] = {-1,-1,-1}; for(int i=0;i
@KartikeyTT7 ай бұрын
If you want to find minimum of three elements in cpp. You can do it like this- int temp = min(arr[0],arr[1]); int lowestI = min(temp, arr[2]);
@AnujGupta-xi5ep7 ай бұрын
For one liner you can do : int ans = min({arr[0], arr[1], arr[2]});
@KartikeyTT7 ай бұрын
@@AnujGupta-xi5ep ohhh, i was doin without the braces and was getting error, so i thought it wasn’t possible in cpp
@square-kstudios95617 ай бұрын
Great explanation! How does one come up with a solution like this in the constraints of an interview though, if we haven't seen it ever in the past? Some companies only give you 15 mins to come up with a solution, explain it, dry run it, code it and then provide the time/space complexity.
@ajithshetty16846 ай бұрын
did you get the answer to your question?
@avengergirl_04643 ай бұрын
@@ajithshetty1684have you got it???
@sohaildarwajkar9979Ай бұрын
@@ajithshetty1684 No one can give u that answer
@DeadCode_Debugs23 күн бұрын
he loves orange
@tanishqtyagi14655 ай бұрын
The series is dam good!! 🤍🤍💯
@dipendrasingh48747 ай бұрын
thank you bhaiya ... please tcs nqt segment i was solving them but u removed that from site .....(or i am not able to find it )please add thank you
@shivisingh99757 ай бұрын
Understood!
@thalap_74-Ай бұрын
🧡
@iamnottech89183 ай бұрын
I solved this ,this way it is easy appproach class Solution { public: int numberOfSubstrings(string s) { int a,b,c; a=b=c=0; int l=0;int r=0; int len=0; while(r=1 && b>=1 && c>=1){ // len++; len=len +(s.length()-r); if(s[l]=='a') a--; else if(s[l]=='b') b--; else if(s[l]=='c') c--; l++; } r++; } return len; } };
@anshsaxena729711 күн бұрын
UnderStood
@chandnikumari69782 ай бұрын
Please upload note of the lecture on a2z sheet .
@socify44106 ай бұрын
fabolous
@user-fw4kz3bb4g6 ай бұрын
EASIEST APPROACH (C++) class Solution { public: int numberOfSubstrings(string s) { int left=0, right=0,count=0; vectorarr(3,0); while(right0 && arr[1]>0 && arr[2]>0){ count+=s.size()-right; arr[s[left]-'a']--; left++; } right++; } return count; } };
@adilkevin62207 ай бұрын
Document link is not attached for some of the program
@CE_113_Katyayni7 ай бұрын
sir your brute force approach is actually wrong because when we sum the hash[0]+hash[1]+hash[2] ==3 here it may be the case that hash[1]=0 and hash[0]=2 in this case also the if state would be true and cnt will increase which is actually wrong
@rohitvishwakarma70467 ай бұрын
Yeah, I think he meant to take the size of hashmap , hope you get it.
@azizkavas69937 ай бұрын
No such case is possible because hash doesnt count the number of occurance instead it just sign the related index. If you try yourself with sample code you will see what I mean. Kind regards.
@ashnidahiya83475 ай бұрын
This is a brute force approach using sets, hope it helps: int countSubStrings(string str, int k) { set st; int count = 0; int n = str.length(); for(int i=0;i
@sparksfly44214 ай бұрын
his code in brute force is correct. The hash array only gets assigned a truthy value (1) at the index of the given alphabet (where index(a) = 0, index(b)=1, index(c)=2) if it happens on the given letter in the string. It can never increment beyond that since it's an assignment operator
@prabhavtrivedi2 ай бұрын
@@ashnidahiya8347 setst
@Flash-qr5oh6 ай бұрын
WoW!
@angeldeveloper8 ай бұрын
❤👍
@NaveenKumar-d9z4o25 күн бұрын
why we need to take minimum in these anyone explain please
My solution: class Solution { public: int numberOfSubstrings(string s) { int count = 0; int l = 0, r = 0; int acount = 0, bcount = 0, ccount = 0; while(r < s.size()){ if(s[r]=='a') acount++; else if(s[r]=='b') bcount++; else ccount++; if(acount>0 && bcount>0 && ccount > 0){ int x = 0; while(acount>0 && bcount>0 && ccount>0){ if(s[l]=='a') acount--; else if(s[l]=='b') bcount--; else ccount--; // count++; x++; l++; } count+=(s.size() - r) * x; // l++; } r++; } return count; } }; what will be the complexity of this? O(N) only na?
@Bhai98667 ай бұрын
public int numberOfSubstrings(String s) { int[] lastSeen = new int[3]; Arrays.fill(lastSeen, -1); int cnt = 0; for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); lastSeen[c - 'a'] = i; if (lastSeen[0] != -1 && lastSeen[1] != -1 && lastSeen[2] != -1) { cnt += (1 + Math.min(lastSeen[0], Math.min(lastSeen[1], lastSeen[2]))); } } return cnt; }
@doremon810726 ай бұрын
demm man
@KartikeyTT7 ай бұрын
If someone can debug this solution then they are real genius class Solution { public: int numberOfSubstrings(string s) { map map; int l = 0; int r = 0; int count = 0; int minValue=0; while (map.size() != 3) { map[s[r]] = r; r++; } while (r < s.length()) { minValue=INT_MAX; for (const auto& pair : map) { cout
@CHILLBRO-e7y4 ай бұрын
i wrote a O(n) code but it gives only 36% better i dont know why and how can i improve it further? class Solution { public: int numberOfSubstrings(string s) { int l=0; int n=s.size(); unordered_map index; int ans=0; for(int r=0;r
@ShubhamMIshra-hv5nz7 ай бұрын
CODE FOR THEOPTIMISED SOLUTION!!!!! class Solution { public: int numberOfSubstrings(string s) { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int count =0; int length=s.size(); int lastSceen[3]={-1,-1,-1}; for(int i =0; i < length; i++){ lastSceen[s[i]-'a']=i; if(lastSceen[0] != -1 && lastSceen[1]!= -1&& lastSceen[2]!=-1) { count += min(lastSceen[0],min(lastSceen[1],lastSceen[2])) +1; } } return count; } }; whats up??
@anmolvanced32625 ай бұрын
viewed multiple times .. but your explanation is not good .. sorry to say!
@ankit1784Ай бұрын
Yadi nhi smj aaya to code dekh ker dry run kero apne smj aa jayega
@SitaRam-m1iАй бұрын
Understood
@adityababu34055 ай бұрын
int numberOfSubstrings(string s) { vector lastSeen(3,-1); int cnt = 0; for(int i=0; i