Wzór słowa

Jan 01 2023
Leetcode Problem dnia [ 01 stycznia 2023 ]
Biorąc pod uwagę wzór i łańcuch s, znajdź, czy s ma ten sam wzór. Tutaj follow oznacza pełne dopasowanie, takie, że istnieje bijekcja między literą we wzorcu a niepustym słowem w s.

Biorąc pod uwagę a patterni string s, znajdź if spodąża za tym samym wzorcem.

Tutaj follow oznacza pełne dopasowanie, takie, że istnieje bijekcja między literą w patterni niepustym słowem w s.

Przykład 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

Skoro to wiemy

„abba” -> „pies kot kot pies”

„a” -> „pies”

„b” -> „kot”

jeśli napotkamy mapę z innym ciągiem, możemy powiedzieć, że nie jest to prawidłowy przypadek testowy.

„abfa” -> „pies kot pies pies”

Leetcode#290. Wzór słowa

„a” -> „pies”

„b” -> „kot”

„f” -> „pies”

ale pies jest już przypisany do a. Używamy więc dwóch map, jedna zrobi mapowanie z -> psem, a druga mapa zrobi mapowanie z psem -> a, abyśmy wiedzieli, że pies jest już mapowany z inną postacią.

Zacznijmy od kodu

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;
    }
}