• 291. Word Pattern II


    DFS+BACKTRACK
    没弄些乱七八糟的符号什么的在test case算是脱离低级趣味了。

    这个题就是正常的划分string,连二段brach都不是。 我只进行了最基础的剪枝,有很多剪枝条件,比如剩余string < pattern之类的。。

    一开始每次循环都建2个MAP保存信息以便回溯,结果破了纪录。
    image
    这辈子没离0这么接近过。。

    换成简单的remove,就好多了。
    Tn = T(n-1) + T(n-2) + ... + T(1)
    T(n-1) = T(n-2) + ... + T(1)
    T(n) = 2T(n-1) = 4T(n-2) = 2^n T(1)

    Time Complexity: O(2^n)
    Space Complexity: O(n)

    public class Solution {
        public boolean wordPatternMatch(String pattern, String str) {
            if (pattern.length() == 0 && str.length() == 0) return true;
            Map<Character, String> map1 = new HashMap();
            Map<String, Character> map2 = new HashMap();
            return dfs(map1, map2, pattern, str, 0, 0);
        }
        
        public boolean dfs(Map<Character, String> map1, Map<String, Character> map2, String pattern, String str, int chPos, int strPos) {
            if (chPos == pattern.length() && strPos == str.length()) {
                return true;
            } else if (chPos >= pattern.length() || strPos >= str.length()) {
                return false;
            } else {
    
                char c = pattern.charAt(chPos);
                for (int i = strPos; i < str.length(); i++) {
                    String tempS = str.substring(strPos, i+1);
                    if (!map1.containsKey(c) && !map2.containsKey(tempS)) {
                        map1.put(c, tempS);
                        map2.put(tempS, c);
                        if (dfs(map1, map2, pattern, str, chPos+1, i+1)) return true;
                        map1.remove(c);
                        map2.remove(tempS);
                    } else if (!map1.containsKey(c) || !map2.containsKey(tempS)) {
                        continue;
                    } else {
                        if (map1.get(c).equals(tempS) && map2.get(tempS) == c) {
                            if (dfs(map1, map2, pattern, str, chPos+1, i+1)) return true;
                        } else {
                            continue;
                        }
                    }
    
                }
                return false;
            }
        }
    }
    
  • 相关阅读:
    50个网页常用小代码
    web前端题目(持续更新)
    一步步构建大型网站架构(转)
    CentOS下配置node.js
    ajax文件上传
    test
    文件上传input简便美化方案
    String.match()与RegExp.exec()
    ie7下zindex问题
    javascript将数组插入到另一个数组中
  • 原文地址:https://www.cnblogs.com/reboot329/p/6056155.html
Copyright © 2020-2023  润新知