zoukankan      html  css  js  c++  java
  • 算法——模式匹配

    你有两个字符串,即pattern和value。 pattern字符串由字母"a"和"b"组成,用于描述字符串中的模式。例如,字符串"catcatgocatgo"匹配模式"aabab"(其中"cat"是"a",“go"是"b”),该字符串也匹配像"a"、"ab"和"b"这样的模式。但需注意"a"和"b"不能同时表示相同的字符串。编写一个方法判断value字符串是否匹配pattern字符串。
    leetcode

    解题思路:dfs。

    1. 遍历每一种a和b对应字符串的可能情况,然后再搜索。
    2. 存在对应的是空字符串的情况,所以,返回边界条件的时候,字符串的索引可以等于字符串的长度。
    class Solution {
        public boolean patternMatching(String pattern, String value) {
            if(pattern.length() == 1) return true;
            String[] mode = new String[2];
            return dfs(mode, pattern, value, 0, 0);
        }
    
        public boolean dfs(String[] mode, String pattern, String value, int i, int j) {
            if(i == pattern.length() && j == value.length()) return true;
            // 因为存在对应空字符串的情况,所以j可以等于value的长度
            if(i >= pattern.length() || j > value.length()) return false;
    
            int cur = pattern.charAt(i) - 'a';
            if(mode[cur] == null) {
            	// 遍历所有可能的情况	
                for(int x = j; x <= value.length(); x++) {
                    mode[cur] = value.substring(j, x);
                    // 防止a和b对应字符串相同
                    if(!mode[cur].equals(mode[cur ^ 1]) && dfs(mode, pattern, value, i + 1, x)) return true;
                }
    			// 回溯
                mode[cur] = null;
                return false;
            } else {
            	// 截取下一个字符串
                int end = mode[cur].length() + j;
                if(end > value.length() || !value.substring(j, end).equals(mode[cur])) return false;
                return dfs(mode, pattern, value, i + 1, end);
            }
        }
    }
    
  • 相关阅读:
    mysql查询两个日期之前相隔的天数
    数据库脏读、不可重读读、幻读
    kafka手动开启监听
    oracle更具uuid排序后进行分页
    idea右键没有svn选项
    alibaba dubbo admin的安装
    简单的可以跑起来的dubbo例子
    tomcat配置内存
    redis介绍和安装
    Python深入:Distutils发布Python模块
  • 原文地址:https://www.cnblogs.com/lippon/p/14117647.html
Copyright © 2011-2022 走看看