• 算法——模式匹配


    你有两个字符串,即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);
            }
        }
    }
    
  • 相关阅读:
    大型项目前端架构浅谈
    图标使用新姿势- react 按需引用 svg 的实现
    为什么json 不能使用 int64类型
    SSL证书对SEO网站优有什么影响?使用HTTPS的SEO优势
    web安全测试必须注意的五个方面
    在小程序中实现 Mixins 方案
    网站web前端常见的优化措施
    前端 HTML空格的六种方式
    如何正确选型,React Native 还是 Native?
    CSS3 渐变(Gradients)
  • 原文地址:https://www.cnblogs.com/lippon/p/14117647.html
Copyright © 2020-2023  润新知