Advertisement
Guest User

Untitled

a guest
May 21st, 2019
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.69 KB | None | 0 0
  1. # Todo algoritmo de sliding window se beneficia do uso de uma estrutura de auxiliar
  2. # de processamento para evitar reprocessar elementos já vistos.
  3. #
  4. # A cada movimento da janela, é necessário atualizar essa estrutura auxiliar:
  5. # - em função das mudanças no lado direito da janela (quem entra)
  6. # - em função das mudanças no lado esquerdo da janela (quem sai)
  7. #
  8. # No problema a seguir, a estrutura auxiliar é um contador, contendo as frequências dos
  9. # elementos presentes na janela atual.
  10. #
  11. # Caso a contagem de elementos da janela atual seja igual à do padrão buscado, temos um anagrama.
  12.  
  13. from collections import Counter
  14.  
  15. class Solution:
  16. def findAnagrams(self, s, p):
  17. # Processando entradas inválidas
  18. if len(s) < len(p):
  19. return []
  20.  
  21. # Criando a estrutura auxiliar de processamento
  22. freq_p = Counter(p)
  23. freq_window = Counter(s[:len(p)])
  24.  
  25. # Deslizando a janela e atualizando a estrutura auxiliar de processamento
  26. ocorrencias = []
  27. i = 0
  28. while True:
  29. # Conferindo se a janela atual é um anagrama
  30. if freq_p == freq_window:
  31. ocorrencias.append(i)
  32.  
  33. # Testando a condição de término do laço
  34. if i + 1 > len(s) - len(p):
  35. break
  36.  
  37. # Atualizando a estrutura auxiliar de processamento em função do caracter que sai
  38. freq_window[s[i]] -= 1
  39. if not freq_window[s[i]]:
  40. del freq_window[s[i]]
  41.  
  42. # Atualizando a estrutura auxiliar de processamento em função do caracter que entra
  43. freq_window[s[i+len(p)]] += 1
  44.  
  45. # Deslocando a janela
  46. i += 1
  47. return ocorrencias
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement