zoukankan      html  css  js  c++  java
  • LeetCode Word Pattern II

    原题链接在这里:https://leetcode.com/problems/word-pattern-ii/

    题目:

    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 substring in str.

    Examples:

    1. pattern = "abab", str = "redblueredblue" should return true.
    2. pattern = "aaaa", str = "asdasdasdasd" should return true.
    3. pattern = "aabb", str = "xyzabcxzyabc" should return false.

    Notes:
    You may assume both pattern and str contains only lowercase letters.

    题解:

    类似Word Pattern. 但这里没有明确分割words的空格.

    采用backtracking, 用pattern内的一个char来试着match不同长度的str substring, 能同时试到pattern 和 str的结尾, 就返回true.

    e.g. pattern = "abab", str = "redblueredblue", 先用"a" match "r", "b" match "e", 又遇到"a", 但str里确实"d", 不match.

    就backtracking下然后用"b" match "ed", 以此类推.

    用HashMap<Character, String> 来保存已经走过的pattern char 和 str substring对应关系.

    同时maintain一个set用来避免相同的string 来match 不同的char. e.g. "a" match "cde", "b"也match "cde".

    Time Complexity: exponential. Space: O(hm.size() + hs.size()).

    AC Java: 

     1 public class Solution {
     2     public boolean wordPatternMatch(String pattern, String str) {
     3         HashMap<Character, String> hm = new HashMap<Character, String>();
     4         HashSet<String> hs = new HashSet<String>();
     5         return isMatch(pattern, 0, str, 0, hm, hs);
     6     }
     7     
     8     private boolean isMatch(String pattern, int i, String str, int j, HashMap<Character, String> hm, HashSet<String> hs){
     9         //stop condition
    10         if(i == pattern.length() && j == str.length()){
    11             return true;
    12         }
    13         if(i == pattern.length() || j == str.length()){
    14             return false;
    15         }
    16         
    17         char c = pattern.charAt(i);
    18         
    19         //If current pattern character already exists in map
    20         if(hm.containsKey(c)){
    21             String cString = hm.get(c);
    22             
    23             //If corresponding string does not match str.substring(j, j+matchedString.length()).
    24             if(!str.startsWith(cString, j)){
    25                 return false;
    26             }
    27             return isMatch(pattern, i+1, str, j+cString.length(), hm, hs);
    28         }else{
    29             //current pattern character doesn't exist in the map
    30             for(int k = j; k<str.length(); k++){
    31                 String s = str.substring(j, k+1);
    32                 
    33                 //different strings can't be matched to same char
    34                 if(hs.contains(s)){
    35                     continue;
    36                 }
    37                 
    38                 hm.put(c, s);
    39                 hs.add(s);
    40                 
    41                 //if all reset string could be matched
    42                 if(isMatch(pattern, i+1, str, k+1, hm, hs)){
    43                     return true;
    44                 }
    45                 
    46                 hm.remove(c);
    47                 hs.remove(s);
    48             }
    49             
    50             //Have tried all different lengths
    51             return false;
    52         }
    53     }
    54 }
  • 相关阅读:
    JS中!=、==、!==、===的用法和区别
    Jquery判断Checkbox是否选中三种方法
    C# 信号量 学习
    redis学习资料
    Redis常用命令
    MySQL、HBase、ES的对比
    我对依赖注入,控制反转的理解
    net输出错误日志
    XmlExtensions帮助类
    DatetimeHelper类的编写
  • 原文地址:https://www.cnblogs.com/Dylan-Java-NYC/p/6351250.html
Copyright © 2011-2022 走看看