LeetCode 290. Word Pattern

Given a pattern and a string str, find if str 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 str.

Examples:

  1. pattern = "abba", str = "dog cat cat dog" should return true.
  2. pattern = "abba", str = "dog cat cat fish" should return false.
  3. pattern = "aaaa", str = "dog cat cat dog" should return false.
  4. pattern = "abba", str = "dog dog dog dog" should return false.

Notes:
You may assume pattern contains only lowercase letters, and str contains lowercase letters separated by a single space.

题意:给定一个模式pattern和一个字符串,判断该字符串是否跟pattern的形式一样。
例:
pattern = "abba", str = "dog cat cat dog" return true.
pattern = "abba", str = "dog cat cat fish" return false.
pattern = "aaaa", str = "dog cat cat dog" return false.
pattern = "abba", str = "dog dog dog dog" return false.
note:
假设pattern中只包含小写字母,字符串str是由空格分割的多个单词组成,且单词也都为小写字母。

思路:使用hashmap
调用put方法时,如果已经存在一个相同的key, 则返回的是前一个key对应的value;如果是新的一个key,则返回的是null

public boolean wordPattern(String pattern, String str) {
        String[] words = str.split(" ");
        if(words.length != pattern.length())
            return false;
        Map map = new HashMap();
        for(Integer i = 0; i < pattern.length(); i++){
            if(map.put(pattern.charAt(i), i) != map.put(words[i], i))//hashmap中, 键可以是任意类型的对象
                return false;
        }
        return true;
    }

思路2:把pattern中的每个字符作为key,str中的每个单词作为value

建立pattern中每个字符和str中每个单词的映射关系,且是一对一的映射关系,不能两个key对应相同的value。
在遍历每个字符c时,先判断map中是否存在该字符c,如果存在该字符c,判断该字符c对应的单词(value)是否与此时的单词word[i]相同,若不同,则返回false;
如果map中不存在该字符c,判断该字符c目前对应的单词word[i]是否已经在map中出现过了,若已经存在word[i],则返回false;
如果map中不存在该字符c,且不存在该单词word[i],则将c和word[i]存入map

public boolean wordPattern(String pattern, String str) {
        String[] words = str.split(" ");
        if(words.length != pattern.length())
            return false;
        Map<Character, String> map = new HashMap<>();
        for(int i = 0; i < words.length; i++){
            char c = pattern.charAt(i);
            if(map.containsKey(c)){
                if(!map.get(c).equals(words[i]))//map中已经存在了c,但map中c对应的单词与此时的word[i]不相同
                    return false; 
            }
            else{
                if(map.containsValue(words[i])){
                    return false;//map中不存在c,但已经存在了与c相对应的单词
                }
                map.put(c, words[i]);
            }
        }
        return true;
    }

 

参考:
https://leetcode.com/problems/word-pattern/discuss/73402/8-lines-simple-Java
https://leetcode.com/problems/word-pattern/discuss/73399/Very-fast-(3ms)-Java-Solution-using-HashMap

posted @ 2018-03-20 12:54  zeroingToOne  阅读(189)  评论(0编辑  收藏  举报