Find All Anagrams in a String - Leetcode 438 - Python

Sdílet
Vložit
  • čas přidán 6. 09. 2024

Komentáře • 68

  • @xyz-vv5tg
    @xyz-vv5tg Před 11 měsíci +7

    Folks is there anyone like me who first sees the question, thinks a lot about it and have absolutely no idea how to even approach the problem, and then later checks neetcode just see the solution?
    I'm afraid that I can't even think of solutions to basic problems

    • @johndong4754
      @johndong4754 Před 11 měsíci +4

      Absolutely nothing wrong with that! It's better to check the solution than to spend too much time trying to solve it on your own. Just make sure you understand why the solution works and how to come up with it

    • @xyz-vv5tg
      @xyz-vv5tg Před 11 měsíci

      @@johndong4754 Thanks a lot for the affirmation John. I'm able to understand why the solution works.

    • @shinoz9517
      @shinoz9517 Před 14 dny +1

      What's your status now? Have you improved?

  • @venkatasriharsha4227
    @venkatasriharsha4227 Před 2 lety +36

    After watching so many problems u solved, it's just a cake walk for me to solve this. Thanks a ton bro ❤️

  • @daniyaljavaid329
    @daniyaljavaid329 Před 4 měsíci +1

    was creating map for every substring when sliding a window & now using only single map for sliding, improved from 1300ms to 450ms kotlin

  • @chethan0
    @chethan0 Před 2 lety +8

    @Neetcode : I think you should increment the left pointer only after appending it to the result if the counts match, Otherwise you will be appending the index+1 into the results

    • @pritz9
      @pritz9 Před rokem +4

      Nope, check the algorithm ,its absolutely fine...make a dry run ,u will get it.

  • @VarunMittal-viralmutant
    @VarunMittal-viralmutant Před 2 lety +1

    Using deque, islice and Counter :)
    p_c = Counter(p)
    anagrams = []
    it = iter(s)
    sliding_window = deque(islice(it, len(p)), maxlen=len(p))
    s_c = Counter(sliding_window)
    if s_c == p_c:
    anagrams.append(0)
    for index, char in enumerate(it, start=1):
    s_c[char] += 1
    s_c[s[index-1]] -= 1
    if s_c == p_c:
    anagrams.append(index)
    return anagrams

  • @fayequehannan2473
    @fayequehannan2473 Před rokem +2

    There can be also one more optimisation we can do if we found a char which is not present in p then we can simply move the left pointer to the position of that char in s +1 and apply the same algo from there...please let me know if it can be considered as a optimisation or not

  • @vedgantilles9379
    @vedgantilles9379 Před 2 lety +3

    If the size of alphabet not a constant, this solution has O(n^2) asymptotic in worst case.
    Actually, there is O(n) solution in this case.
    You should calculate the number of symbols , which counts in p equal to counts in current window
    And when this number will be equal to number of keys in pCount, it's the answer

    • @rabomeister
      @rabomeister Před 22 dny

      Keys? you can get aab = bba if you care about keys. what you say is a first constraint, then you need to count them all too. is there anything i misunderstood?

  • @viggicodes
    @viggicodes Před rokem

    One more approach using char counter -> represent the string as count of each alphabet.
    def findAnagrams(self, s: str, p: str) -> List[int]:
    l = 0
    res = []
    counter = [0] *26
    for c in p:
    index = ord(c) - ord('a')
    counter[index] = counter[index] + 1
    counter2 = [0] * 26
    for r in range(len(s)):
    index = ord(s[r]) - ord('a')
    counter2[index] = counter2[index] + 1
    while r - l + 1 == len(p):
    if counter2 == counter:
    res.append(l)
    index = ord(s[l]) - ord('a')
    counter2[index] = counter2[index] -1
    l = l + 1
    return res

  • @7Ibby
    @7Ibby Před 2 lety +3

    Hi. Really enjoy your videos and have been learning a lot from you. Just wanted to share my way I did this problem, if that's cool.
    After checking the edge case of length of p being greater than length of s, I created two dictionaries/hashmaps and initialized them with all the letters from set(s+p) with 0. This allows you to skip the check if the letter in the dictionary/hashmap is zero and pop it. Then incremented the first (length of p) letters in both dictionaries/hashmaps. After, I just use a for loop, check if the dictionaries are equal and then decrement the left letter and increment the next letter in string s until the end.
    I'd share my code if you're cool with it or if you're interested.

    • @EagerEggplant
      @EagerEggplant Před 2 lety +2

      you dont need a for loop to check if the dicts are equal

  • @srinadhp
    @srinadhp Před 2 lety +5

    As usual very aesthetic explanation and solution!

  • @isabelayala7477
    @isabelayala7477 Před 2 lety +6

    This makes so much sense. I had a similar approach in mind but just couldn’t figure out how to implement it. Thanks so much!

    • @Rishabhsingh-ev7ii
      @Rishabhsingh-ev7ii Před 2 lety

      what is logic here in 16 line can anyone explain me

    • @user-ff2ep5kk5i
      @user-ff2ep5kk5i Před 8 měsíci

      @@Rishabhsingh-ev7ii since we are comparing the maps, we need to pop the key when there is a 0 count for that key.

  • @ramyaarathnakumar7468
    @ramyaarathnakumar7468 Před 2 lety +1

    Have a doubt here, if we're anyways creating a hashmap sliding window over s, why not start from 0, the operation is anyway the same, why do we need to create a separate for loop initially?

  • @shreyabhattacherjee6388
    @shreyabhattacherjee6388 Před 7 měsíci

    Thanks a lot for the solution, this is very helpful, how is it ensured that the keys in the two hash maps are in the same order ? If they are not the same then the comparison of the two dictionaries will result in False

  • @Chirayu19
    @Chirayu19 Před rokem

    Another similar approach:
    Create two pointers L and R
    Check both the maps:
    If you find any freq lesser than the other map-> Increment R
    If you find any freq greater than the other map-> Increment L
    If all are eqaul -> Updater answer and increment both L and R

  • @swarnabhkashyap5764
    @swarnabhkashyap5764 Před 2 lety +1

    Great video. Just one doubt. Why are we decrementing the count of the character represented by the left pointer by 1 instead of removing the character from sCount dictionary?

    • @rajkumarkhatri8119
      @rajkumarkhatri8119 Před 2 lety +2

      Think of ‘aaaaaaa’ if your left pointer is at first ‘a’ then left += 1, if you remove ‘a’ from count dictionary, that is misleading because you several other occurrences of ‘a’ in your sliding window

  • @MP-ny3ep
    @MP-ny3ep Před rokem

    This solution is awesome . Thank you so much !

  • @auroshisray9140
    @auroshisray9140 Před 2 lety

    Really helpful ...from approach to code is always a tough part

  • @MyPodie
    @MyPodie Před 2 lety

    Is there a way to solve it with just one for loop? Or is the first loop necessary and why is that? I keep trying to come up with one but can't. Thanks!!

  • @faizanahmed6072
    @faizanahmed6072 Před rokem

    def findAnagrams(self, s: str, p: str) -> List[int]:
    if len(s) < len(p):
    return []
    c=Counter(p)
    res=[]
    for i in range(len(s)-len(p)+1):
    temp=Counter(s[i:i+len(p)])
    if temp==c:
    res.append(i)
    return res

  • @garwar1234
    @garwar1234 Před 2 lety

    Getting time limit exceeded on leetcode for this solution. I coded in swift.

  • @zihaoli9683
    @zihaoli9683 Před 2 lety

    wow this is pretty brilliant

  • @krateskim4169
    @krateskim4169 Před rokem

    Thank You

  • @kumarspandanpattanayak3489

    Thanks Man , good one :)

  • @sam_pnw
    @sam_pnw Před 2 lety

    Good job

  • @mingjuhe1514
    @mingjuhe1514 Před 2 lety

    Thanks bro

  • @SAROJKUMAR-xe8vm
    @SAROJKUMAR-xe8vm Před 10 měsíci

    so the time complexity will be O(len(s)*len(p)), because comparing two dictionaries will take O(len(keys))

  • @naveenprasanthsa3749
    @naveenprasanthsa3749 Před 2 lety +1

    Happy diwali💥💣

  • @lilyh4573
    @lilyh4573 Před 2 lety

    Are all medium problems this tricky and hard?!? Oh man DX thanks for trying to teach us noobs Neet!!

  • @ngneerin
    @ngneerin Před 2 lety +1

    Can't compare two hashmaps in javascript in one sentence. It is a O(n) operation

    • @mocamoca_enh
      @mocamoca_enh Před 2 lety +5

      It is also O(n) in Python. He explains that comparing the 2 hashmaps in this specific problem to be O(26) since there are constraints on the anagram string to be only using a-z. Despite the size of string p either hashmap will have a maximum size of 26.

  • @sagarpotnis1215
    @sagarpotnis1215 Před 2 lety +2

    how is the complexity of the solution O(n) ? should it be O(s x p)

    • @nioi
      @nioi Před rokem +1

      The size of the hashmap is at max O(26). Therefore it is O(p + s * 26)

    • @xenky0
      @xenky0 Před rokem

      Me too, the dict comparison should take O(p) right?

  • @nagendrabommireddi8437

    class Solution:
    def findAnagrams(self, s: str, p: str) -> List[int]:
    a=Counter(list(p))
    print(a)
    d=[]
    i=0
    j=0
    while j

  • @asrahussain8642
    @asrahussain8642 Před rokem

    10:44 why did we pop s[l] ?

    • @manasisingh294
      @manasisingh294 Před 24 dny +1

      we gotta slide our window and for that you basically pop one from the left end and start considering one more from the right end. And that popping is done when you aren't considering that letter at the moment (it is not in your current window). We increment the left pointer. As such, we are no longer pointing at a character (and we're pointing at a new character at the left pointer), so we decrement the count of that character in sCount. If the count of that character is 0, we remove it from the dictionary.

  • @pratyakshsinha6292
    @pratyakshsinha6292 Před 2 lety +2

    Laughs in C++

  • @gladyouseen8160
    @gladyouseen8160 Před 2 lety

    Hey bro i follow your videos. The most of videos are pythonic way. It would be good if you tell some logic that can be possible to optmise more.
    For e.g.
    Here we could have reduced one dictionary and use a variable called "distinct_letters_in_d" and when ever it reaches to 0 we could have added the "l" to res

  • @varunshrivastava2706
    @varunshrivastava2706 Před 2 lety +13

    Just one suggestion @NeetCode please avoid using one-liners they are not readable and cause ambiguity.

    • @fa11en1ce
      @fa11en1ce Před 2 lety +1

      Looks fine to me imo

    • @B-Billy
      @B-Billy Před 6 měsíci +1

      No issues in that...

    • @manasisingh294
      @manasisingh294 Před 24 dny +1

      at some point, you'll have to write one-liners. It's better to start early and keep practising alongside.

    • @Fran-kc2gu
      @Fran-kc2gu Před 8 dny

      If it's a simple statement or a ternary, don't see a problem, if the operation does 2 or 3 things I would consider it a problem

    • @varunshrivastava2706
      @varunshrivastava2706 Před 8 dny

      I used to be a noob 2 years ago 😂😂. Looking back at my old comments is like a trip down the memory lane. Thanks for commenting tho

  • @parulvats
    @parulvats Před rokem

    wow

  • @Rishabhsingh-ev7ii
    @Rishabhsingh-ev7ii Před 2 lety

    what is logic here in 16 line can anyone explain me

    • @hero_py
      @hero_py Před 2 lety +1

      We increment the left pointer. As such, we are no longer pointing at a character (and we're pointing at a new character at the left pointer), so we decrement the count of that character in sCount. If the count of that character is 0, we remove it from the dictionary.

    • @manasisingh294
      @manasisingh294 Před 24 dny

      we gotta slide our window and for that you basically pop one from the left end and start considering one more from the right end. And that popping is done when you aren't considering that letter at the moment (it is not in your current window).

  • @foreverbowie2720
    @foreverbowie2720 Před 3 měsíci

    Share my super simple solution:
    def findAnagrams(self, s: str, p: str) -> List[int]:
    res = []
    p = sorted(p)
    l = 0
    for r in range(len(p) - 1, len(s)):
    if sorted(s[l:r + 1]) == p:
    res.append(l)
    l += 1
    return res

  • @friction5001
    @friction5001 Před 2 lety

    First comment