[Leetcode] 291. Word Pattern II

本篇博客详细介绍了LeetCode中的291题,即Word Pattern II的解决方案。这是一个使用回溯(backtrack)算法的典型问题。在递归过程中,会有一个指针在模式(pattern)上逐步移动,同时另一个指针在输入字符串(str)上按步长n移动。解题思路分为两种情况:1. 如果当前模式字符已有匹配的子字符串,就继续匹配;2. 若无匹配子字符串,则尝试所有可能的子字符串进行匹配。整个过程采用深度优先搜索(DFS)策略,并通过patternMap记录模式字符与字符串子串的映射,同时用visited避免重复匹配。最后,代码中还加入了剪枝操作,避免无效的匹配尝试。
摘要由CSDN通过智能技术生成

这一题其实就是一道典型的backtrack的题目,每一个递归层的前进都伴随着一个指针在pattern上前进一格,然后另一个指针在str上前进n格(n = 1, 2, 3...到字符串结尾)。譬如pattern = "abab", str = "redblueredblue",第一个递归层往下走之后,对应pattern的指针只往前走一个,对应str的指针可以推进任意格造成任意的子字符串对应pattern第一个字符a。

每往下走一层,就分以下几种情况
1. 当前的pattern指针所对应的字母是否有对应的子字符串,有子字符串的话,你就知道str那边应该取多长的字符串与之匹配,如果配得上,就pattern指针往下走一格,str对应的指针往下走对应的格数,否则直接返回FALSE
2. 如果没有对应的子字符串,就按照上面的描述那样让当前的pattern指针指向的字符去匹配所有可能的子字符串并且往下走递归层。

 

思路并不复杂,可以得到代码如下:

    public boolean wordPatternMatch(String pattern, String str) {
        HashMap<Character, String> patternMap = new HashMap<>(); 
        return _wordMatch(patternMap, new HashSet<>(), pattern, s
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值