• 291.Word Pattern II


        /*
         * 291.Word Pattern II
         * 2016-3-13 by Mingyang
         * 这道题目有一定的难度,又是一个backtracking boolean的题目,不过这里多了一个参数Hashmap
         * 1.长度标准:无
         * 2.可选的范围:从j开始,也就是从str未match的第一个字符开始的一系列的substring
         * 3.往前走一步:改变map,将两个对应的东西分别放入map
         * 4.后退一步:把map刚刚加入的值去掉
         * 5.特别的case:刚好搜完和一个搜完了另一个没搜完,一个return true。另一个return false
         * 我们要backtracking所有的可能的string的组合, 对于每个组合, 我们都需要添加到hashmap中, 
         */
        public boolean wordPatternMatch(String pattern, String str) {
                HashMap map = new HashMap();
                return dfs(pattern, 0, str, 0, map);
            }
        private boolean dfs(String pattern, int i, String str, int j, HashMap map){
                if(i == pattern.length() && j == str.length()){// 如果刚好搜完. 返回true
                    return true;
                }
                if(i == pattern.length() || j == str.length()){
                    // 如果一个完了, 另一个没完, 返回false
                    return false;
                }
                char c = pattern.charAt(i); //initialize new value
                for(int k = j; k < str.length(); k++){
                    if(map.get(c) == map.get(str.substring(j, k+1))){
            //如果map中的i对应的值(可以是null) 和 sbustring对应的值相同(也可以是null)
                        Integer val = (Integer)map.get(c);
                        if(val == null){//如果是null
                            map.put(pattern.charAt(i), i);
                         //把pattern的<char,integer>放map中
                            map.put(str.substring(j, k+1), i);
                         //把string的<string,integer>放map中
                        }
                        if(dfs(pattern, i+1, str, k+1, map)){//dfs
                            return true;
                        }
                        if(val == null){// backtracking
                            map.remove(pattern.charAt(i));
                            map.remove(str.substring(j, k+1));
                        }
                    }
                }
                return false;
            //注意不要忘了,不能继续走下去拿到合适的match一定要return false
            }
  • 相关阅读:
    Linux Bash常用命令记录
    Ubuntu 环境 openMVG+openMVS 配置
    GDB调试系列之了解GDB
    OpenCV4系列之图像梯度
    ffmpeg基本功能使用
    GDB调试系列之基础入门
    STL std::pair基本用法
    判断机器CPU的大小端模式并将数据转换成小端形式
    由对象集合创建各种映射_流
    静态类型与函数重载
  • 原文地址:https://www.cnblogs.com/zmyvszk/p/5636394.html
Copyright © 2020-2023  润新知