Leetcode - Word Pattern II

My code:

import java.util.HashMap;
import java.util.HashSet;

public class Solution {
    public boolean wordPatternMatch(String pattern, String str) {
        if (pattern == null || str == null) {
            return false;
        }
        return helper(pattern, str, 0, 0, new HashMap<Character, String>(), new HashSet<String>());
    }
    
    private boolean helper(String p, String s, int index, int begin, HashMap<Character, String> map, HashSet<String> set) {
        if (index == p.length() && begin == s.length()) {
            return true;
        }
        else if (index == p.length() || begin == s.length()) {
            return false;
        }
        
        char curr = p.charAt(index);
        if (map.containsKey(curr)) {
            String val = map.get(curr);
            if (s.substring(begin).startsWith(val)) {
                return helper(p, s, index + 1, begin + val.length(), map, set);
            }
            else {
                return false;
            }
        }
        else {
            for (int i = begin; i < s.length(); i++) {
                String next = s.substring(begin, i + 1);
                if (set.contains(next)) {
                    continue;
                }
                else {
                    set.add(next);
                    map.put(curr, next);
                    boolean flag = helper(p, s, index + 1, begin + next.length(), map, set);
                    if (flag) {
                        return true;
                    }
                    set.remove(next);
                    map.remove(curr);
                }
            }
            return false;
        }
    }
}

reference:
https://discuss.leetcode.com/topic/26750/share-my-java-backtracking-solution/2

这道题目没能做出来不应该的。
其实和
Regular Expression
Wildcard Matching
很相似,都是 pattern match的问题。然后都需要 backtracking

只不过我一开始想的是,string 做key, character 做value
这样的话,每次dfs,对于string,就需要传入begin, end两个参数。有点麻烦
然后这里的话反了下。
好处是,
当我们拿到这一层的character 时,如果hashtable中存在这个key,那么取出value,判断当前string是否 startsWith(value)
如果是,就进入下一级,如果不是,就返回false

如果hashtable 不存在这个key
那么就需要用 backtracking 标志性的 for-loop
遍历每种情况。
同时,不同的key不同映射到同个string,用这个条件可以减去some branch to reduce the time

差不多就这样了。

Anyway, Good luck, Richardo! -- 09/19/2016

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,767评论 0 33
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,853评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,742评论 18 399
  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 13,877评论 0 38
  • My code: reference:https://discuss.leetcode.com/topic/332...
    Richardo92阅读 615评论 0 0