[Leetcode] 291. Word Pattern II 解题报告

这篇博客探讨了LeetCode中的291题,即判断字符串是否遵循给定的单词模式。博主首先介绍了问题背景和样例,然后分享了两种解题思路:一是统计模式中字符出现的次数并搜索满足条件的单词长度组合,二是利用深度优先搜索(DFS)策略。虽然DFS策略不易理解,博主计划后续深入理解并补充详细解析。目前,给出了使用DFS的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

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.

Examples:

  1. pattern = "abab", str = "redblueredblue" should return true.
  2. pattern = "aaaa", str = "asdasdasdasd" should return true.
  3. pattern = "aabb", str = "xyzabcxzyabc" should return false.

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

思路

和上一道题目项目,由于没有空格可以分割,所以只能进行暴力搜索。我想到的第一种搜索策略是:首先统计pattern中的每个字符出现的次数,然后暴力搜索不同字符对应word长度的组合,大概意思就是找出满足sum(hash[p[i]] * num(p[i])) = str.length()的所有组合num(p[i]),其中hash[p[i]]表示p[i]在pattern中的出现次数,num(p[i])表示p[i]对应的word的长度。然后对于每一个组合,采用和上一题目相同的思路,去验证是否满足word pattern的匹配,一旦发现有一个组合满足,就返回true,否则返回false。

后来在网上看到一种采用深度优先策略直接搜索的代码,确实不太容易理解,不过还是贴出来供大家参考。(等到自己完全理解了再来这里补充思路,有对这个代码特别理解的大神,欢迎在评论中解惑)。

代码

class Solution {
public:
    bool wordPatternMatch(string pattern, string str) {
        return DFS(pattern, 0, str, 1);
    }
private:
    bool DFS(string &p, int k, string &str, int len) {
        int pLen = p.size(), sLen = str.size();
        if(pLen == k && sLen == 0) {
            return true;  
        }
        if(pLen - k > sLen || pLen == k || sLen == 0 || len > sLen) {
            return false;  
        }
        if(DFS(p, k, str, len + 1)) {
            return true;
        }
        string left = str.substr(0, len), right = str.substr(len);  
        int flag = hash1.count(p[k]);  
        if(hash1.count(p[k]) && hash1[p[k]] != left) {
            return false;  
        }
        if(hash2.count(left) && hash2[left] != p[k]) {
            return false;  
        }
        hash1[p[k]] = left, hash2[left] = p[k];  
        if(DFS(p, k + 1, right, 1)) {
            return true; 
        }
        if(hash1.count(p[k]) != flag) {
            hash1.erase(p[k]), hash2.erase(left);  
        }
        return false;
    }
    unordered_map<char, string> hash1;
    unordered_map<string, char> hash2;
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值