Word Pattern II

Given a pattern and a string str, find if str follows the same pattern.

Here follow means a full match, such that there is a bijection between a letter in pattern and a non-empty substring in str.(i.e if a corresponds to s, then b cannot correspond to s. For example, given pattern = "ab", str = "ss", return false.)

Example

Example 1

Input:
pattern = "abab"
str = "redblueredblue"
Output: true
Explanation: "a"->"red","b"->"blue"

Example 2

Input:
pattern = "aaaa"
str = "asdasdasdasd"
Output: true
Explanation: "a"->"asd"

Example 3

Input:
pattern = "aabb"
str = "xyzabcxzyabc"
Output: false

Notice

You may assume both pattern and str contains only lowercase letters.

思路:用hashmap记录之前匹配的c to string, 然后遇见c了,看有没有匹配过,如果匹配过,那么str是不是以prefix开头;如果没有就进行搜索匹配,尝试所有的可能,另外如果之前匹配过的str不能再用了,跳过;

class Solution {
    public boolean wordPatternMatch(String pattern, String str) {
        if(pattern == null && str == null) {
            return true;
        }
        if(pattern == null || str == null) {
            return false;
        }
        HashMap<Character, String> hashmap = new HashMap<>();
        return dfs(pattern, str, hashmap);
    }
    
    private boolean dfs(String pattern, String str, HashMap<Character, String> hashmap) {
        if(pattern.isEmpty()) {
            return str.isEmpty();
        }
        char c = pattern.charAt(0);
        if(hashmap.containsKey(c)) {
            String match = hashmap.get(c);
            if(!str.startsWith(match)) {
                return false;
            } else {
                return dfs(pattern.substring(1), str.substring(match.length()), hashmap);
            }
        } else {
            // hashmap do not contains c;
            for(int i = 0; i < str.length(); i++) {
                String match = str.substring(0, i + 1);
                // 这个很重要,如果当前string,前面已经用过了,就不能再用了;
                if(hashmap.values().contains(match)) { 
                    continue;
                }
                hashmap.put(c, match);
                if(dfs(pattern.substring(1), str.substring(match.length()), hashmap)) {
                    return true;
                }
                hashmap.remove(c);
            }
            return false;
        }
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值