• 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

  • 相关阅读:
    POJ 3114 Tarjan+Dijkstra
    278. First Bad Version
    209. Minimum Size Subarray Sum
    154. Find Minimum in Rotated Sorted Array II
    153. Find Minimum in Rotated Sorted Array
    710. Random Pick with Blacklist
    767. Reorganize String
    524. Longest Word in Dictionary through Deleting
    349. Intersection of Two Arrays
    350. Intersection of Two Arrays II
  • 原文地址:https://www.cnblogs.com/zeroingToOne/p/8608582.html
Copyright © 2020-2023  润新知