美文网首页
[Leetcode 290] Word Pattern (Eas

[Leetcode 290] Word Pattern (Eas

作者: 灰睛眼蓝 | 来源:发表于2019-05-13 06:10 被阅读0次

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.

Example 1:

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

Example 2:

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

Example 3:

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

Example 4:

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

Notes:

  • You may assume pattern contains only lowercase letters, and str contains lowercase letters that may be separated by a single space.

Solution

  1. 题目要求的是找是否有匹配, 且bijection between a letter in pattern and a non-empty word in str.。 所以采用2个Map
        Map<String, String> pattern2Str = new HashMap<> ();
        Map<String, String> str2Pattern = new HashMap<> ();
  1. 首先将str用space split得到一个List,判断pattern的长度和strList长度是否一致,不一致就肯定不是same pattern,直接返回false
  2. 然后用一个loop同时扫描pattern和strList, 判断二者是否follow same pattern
    • 如果pattern2Strstr2Pattern2个map都不包含sub patternsub String,那么就写入Map
    • 如果任一一个包含,那么就判断pattern2Str中对应的str value是否与当前sub String相同,不同则不是same pattern,直接返回false。
    • 同时,因为是双向匹配的,所以必须同时判断str2Pattern中对应的pattern value是否与当前sub pattern相同,不同则不是same pattern,直接返回false。

E.g "abba", str = "dog cat cat fish"
pattern2Str: , Str2Pattern:
index = 0, 写入a : dog ----- dog: a
index = 1, 写入b : cat ----- cat: b
index = 2, pattern2Str中key == b, value == cat, 与str[2] == cat符合, 反之也吻合
index = 3, pattern2Str中key == a, value ==dog, 与str[3] == fish不吻合。返回false

或者用一个map也可以解决

  1. Map<pattern, String>: 如果map中没有包含pattern,那么应该写入map;但是如果此时的String已经在map中了,那么就是 "ab", "cat, cat"这种情况,返回false
  2. 如果map中包含pattern,判断map中的String与list中的String是否吻合,不吻合则返回false
class Solution {
    public boolean wordPattern(String pattern, String str) {
//         String[] words = str.split (" ");
//         if (words.length != pattern.length ()) {
//             return false;
//         }
        
//         Map<String, String> tracker = new HashMap<> ();
        
//         for (int i = 0; i < words.length; i++) {
//             if (!tracker.containsKey (pattern.substring(i, i + 1))) {
//                 if (tracker.containsValue (words [i])) {
//                     return false;
//                 }
                
//                 tracker.put (pattern.substring(i, i + 1), words[i]);
//             } else {
//                 if (!tracker.get (pattern.substring (i, i + 1)).equals (words[i])) {
//                     return false;
//                 }
//             }
//         }

//         return true;
//     }
        
        String[] strList = str.split (" ");
        if (strList.length != pattern.length ()) {
            return false;
        }
        
        Map<String, String> pattern2Str = new HashMap<> ();
        Map<String, String> str2Pattern = new HashMap<> ();
        
        for (int i = 0; i < pattern.length (); i++) {
            String patternEntry = pattern.substring (i, i + 1);
            String strEntry = strList [i];
            
            if (!pattern2Str.containsKey (patternEntry) && !str2Pattern.containsKey (strEntry)) {
                pattern2Str.put (patternEntry, strEntry);
                str2Pattern.put (strEntry, patternEntry);
            }
            
            if (!pattern2Str.getOrDefault(patternEntry, "").equals (strEntry) || !str2Pattern.getOrDefault (strEntry, "").equals (patternEntry)) {
                return false;
            }
        }
        
        return true;
    }
}

相关文章

网友评论

      本文标题:[Leetcode 290] Word Pattern (Eas

      本文链接:https://www.haomeiwen.com/subject/kgjkaqtx.html