JIAKAOBO

LeetCode

venmo
wechat

感谢赞助!

  • ㊗️
  • 大家
  • offer
  • 多多!

Problem

Given a pattern and a string s, find if s follows the same pattern.

Here follow means a full match, such that there is a bijection between a letter in pattern and a non-empty word in s.

Example 1:

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

Example 2:

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

Example 3:

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

Example 4:

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

Constraints:

  • 1 <= pattern.length <= 300
  • pattern contains only lower-case English letters.
  • 1 <= s.length <= 3000
  • s contains only lower-case English letters and spaces ‘ ‘.
  • s does not contain any leading or trailing spaces.
  • All the words in s are separated by a single space.

Code

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

        HashMap<Character,String> map = new HashMap<>();
        for(int i = 0; i < pattern.length(); i++){
            char c = pattern.charAt(i);
            String word = words[i];

            if(map.containsKey(c)){
                if(!map.get(c).equals(word)){
                    return false;
                }
            } else {
                if(map.containsValue(word)){
                    return false;
                }
            }

            map.put(c, word);
        }

        return true;
    }
}
class Solution:
    def wordPattern(self, pattern: str, s: str) -> bool:
        dd = defaultdict(str)

        words = s.split()

        if len(words) != len(pattern):
            return False

        for pp, word in zip(pattern, words):
            if pp in dd and dd[pp] != word:
                return False

            if pp not in dd and word in dd.values():
                return False

            dd[pp] = word

        return True