Padrão de palavras

Jan 01 2023
Problema Leetcode do dia [01 de janeiro de 2023]
Dado um padrão e uma string s, descubra se s segue o mesmo padrão. Aqui, seguir significa uma correspondência completa, de modo que haja uma bijeção entre uma letra no padrão e uma palavra não vazia em s.

Dado a patterne uma string s, encontre se ssegue o mesmo padrão.

Aqui , seguir significa uma correspondência completa, de modo que haja uma bijeção entre uma letra in patterne uma palavra não vazias em .

Exemplo 1:

Input: pattern = "abba", s = "dog cat cat dog"
Output: true

Input: pattern = "abba", s = "dog cat cat fish"
Output: false

Input: pattern = "aaaa", s = "dog cat cat dog"
Output: false

Como sabemos que

“abba” -> “cachorro gato gato cachorro”

'a' -> “cachorro”

'b' -> “gato”

se encontrarmos um mapa com uma string diferente, podemos dizer que não é um caso de teste válido.

“abfa” -> “cão gato cão cão”

Leetcode#290. Padrão de palavras

'a' -> “cachorro”

'b' -> “gato”

'f' -> “cachorro”

mas o cão já está atribuído a a. Então, usamos dois mapas, um fará o mapeamento com a -> cachorro e outro mapa fará o mapeamento com o cachorro -> a para que saibamos que o cachorro já está sendo mapeado com outro personagem.

Vamos iniciar o código

class Solution {
    public boolean wordPattern(String pattern, String s) {
        String[] tokens = s.split(" ");
        
        if(pattern.length() != tokens.length) 
            return false;

        HashMap<String, Character> map = new HashMap<>();
        HashMap<Character, String> reverseMap = new HashMap<>();

        for(int i=0;i<tokens.length;i++) {
            String find = tokens[i];
            char pt = pattern.charAt(i);
            
            if(!map.containsKey(find))
                map.put(find, pt);
            if(!reverseMap.containsKey(pt))
                reverseMap.put(pt, find);

            char mapPt = map.get(find);
            String mapStr = reverseMap.get(pt);
            
            if(mapPt != pt)
                return false;
            if(!mapStr.equals(find))
                return false;
        }
        return true;
    }
}