算法——模式匹配

你有两个字符串,即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);
        }
    }
}
原文地址:https://www.cnblogs.com/lippon/p/14117647.html