用 KMP 算法实现字符串匹配,支持通配符。

KMP(Knuth-Morris-Pratt)算法是一种用于在字符串中查找子串的高效算法。标准的 KMP 算法不支持通配符,但我们可以通过一些修改来扩展它,以支持通配符匹配。常见的通配符包括  ?(匹配任意单个字符)和  *(匹配任意数量的字符,包括零个字符)。

为了实现支持通配符的字符串匹配,我们可以使用一种类似于动态规划的方法,而不是直接使用标准的 KMP 部分匹配表。下面是一个实现支持  ? 和  * 通配符的字符串匹配算法:

pythonCopy Codedef is_match(pattern, text):
    m, n = len(pattern), len(text)    
    # dp[i][j] 表示 pattern[0:i] 是否能匹配 text[0:j]
    dp = [[False] * (n + 1) for _ in range(m + 1)]    
    # 空模式可以匹配空文本
    dp[0][0] = True
    
    # 处理模式以 '*' 开头的情况,因为 '*' 可以匹配空字符
    for i in range(1, m + 1):        if pattern[i - 1] == '*':
            dp[i][0] = dp[i - 1][0]    
    for i in range(1, m + 1):        for j in range(1, n + 1):            if pattern[i - 1] == text[j - 1] or pattern[i - 1] == '?':                # 当前字符匹配,继承前一个状态
                dp[i][j] = dp[i - 1][j - 1]            elif pattern[i - 1] == '*':                # '*' 可以匹配零个字符或多个字符
                dp[i][j] = dp[i - 1][j] or dp[i][j - 1]    
    return dp[m][n]# 示例用法pattern = "a*b?c"text = "aabcc"print(is_match(pattern, text))  # 输出 True

代码说明:

  1. 动态规划表  dp‌:

    • dp[i][j] 表示  pattern[0:i] 是否能匹配  text[0:j]
    • 初始化  dp[0][0] 为  True,因为空模式可以匹配空文本。
  2. 处理  * 通配符‌:

    • 如果  pattern[i-1] 是  *,它可以匹配零个字符(即  dp[i][j] = dp[i-1][j])或多个字符(即  dp[i][j] = dp[i][j-1])。
  3. 字符匹配‌:

    • 如果  pattern[i-1] 和  text[j-1] 相等,或者  pattern[i-1] 是  ?,则  dp[i][j] 继承  dp[i-1][j-1]
  4. 最终结果‌:

    • dp[m][n] 表示整个模式是否能匹配整个文本。

这种实现方式利用了动态规划的思想,能够高效地处理包含通配符的字符串匹配问题。时间复杂度为  O(m×n) O ( m × n ),其中  m m 是模式的长度, n n 是文本的长度。


http://xuexiao.zgjzs.org

http://jianzhu.zgjzs.org

http://gongcheng.zgjzs.org

http://sheji.zgjzs.org

http://fangwu.zgjzs.org

http://jiaoyu.zgjzs.org

http://kejian.zgjzs.org

http://chengshi.zgjzs.org

http://guihua.zgjzs.org

http://jiaju.zgjzs.org

http://jianli.zgjzs.org

http://zhucai.zgjzs.org

http://jichu.zgjzs.org

http://gaosu.zgjzs.org

http://ditu.zgjzs.org

http://lvyou.zgjzs.org

http://zhishi.zgjzs.org

http://shipin.zgjzs.org

http://peixun.zgjzs.org

http://wenhua.zgjzs.org

http://gongsi.zgjzs.org

http://renwu.zgjzs.org

http://xinwen.zgjzs.org

http://zixun.zgjzs.org

http://anli.zgjzs.org

http://guwen.zgjzs.org

http://zhaopin.zgjzs.org

http://yingxiao.zgjzs.org

http://guanli.zgjzs.org

http://peitao.zgjzs.org

http://jixie.zgjzs.org

http://zhuangxiu.zgjzs.org

http://anquan.zgjzs.org

http://chengguo.zgjzs.org

http://baogao.zgjzs.org

http://chengjiu.zgjzs.org

http://zhanshi.zgjzs.org

http://huodong.zgjzs.org

http://huiyi.zgjzs.org

http://tongji.zgjzs.org

http://jiaoliu.zgjzs.org

http://keti.zgjzs.org

http://jingcai.zgjzs.org

http://tuandui.zgjzs.org

http://jingying.zgjzs.org

http://wenjian.zgjzs.org

http://baoming.zgjzs.org

http://wangzhan.zgjzs.org

http://xiazai.zgjzs.org

http://chengxin.zgjzs.org

http://nanzhuang.shangpin.org

http://xiezi.shangpin.org

http://baozi.shangpin.org

http://yundong.shangpin.org

http://shuma.shangpin.org

http://diannao.shangpin.org

http://shouji.shangpin.org

http://jiajv.shangpin.org

http://canju.shangpin.org

http://muying.shangpin.org

http://shipin.shangpin.org

http://jiushui.shangpin.org

http://jiafang.shangpin.org

http://shouna.shangpin.org

http://meishi.shangpin.org

http://lingshi.shangpin.org

http://chufang.shangpin.org

http://jianshen.shangpin.org

http://qiche.shangpin.org

http://yundongyi.shangpin.org

http://bangong.shangpin.org

http://wenju.shangpin.org

http://shuben.shangpin.org

http://dianqi.shangpin.org

http://jiadian.shangpin.org

http://fanghuo.shangpin.org

http://fangshui.shangpin.org

http://fangdao.shangpin.org

http://muyuan.shangpin.org

http://fengshui.shangpin.org

http://zhuangxiu.shangpin.org

http://gongju.shangpin.org

http://chaju.shangpin.org

http://weisheng.shangpin.org

http://xiangbao.shangpin.org

http://yanjing.shangpin.org

http://shoubiao.shangpin.org

http://shipinbao.shangpin.org

http://jiazhuang.shangpin.org

http://chuanglian.shangpin.org

http://yundongxie.shangpin.org

http://tiyu.shangpin.org

http://luyou.shangpin.org

http://jiejing.shangpin.org

http://shumaerji.shangpin.org

http://chejian.shangpin.org

http://xihu.shangpin.org

http://zhizao.shangpin.org

http://cheshen.shangpin.org

http://zhinen.shangpin.org

http://xinwen.snjrw.org

http://zixun.snjrw.org

http://keji.snjrw.org

http://jiaoyu.snjrw.org

http://renwu.snjrw.org

http://wenhua.snjrw.org

http://lishi.snjrw.org

http://jingji.snjrw.org

http://caijing.snjrw.org

http://jinrong.snjrw.org

http://touzi.snjrw.org

http://fangchan.snjrw.org

http://chanye.snjrw.org

http://gongye.snjrw.org

http://qiche.snjrw.org

http://shuma.snjrw.org

http://yule.snjrw.org

http://dianying.snjrw.org

http://yinyue.snjrw.org

http://meiti.snjrw.org

http://hulianwang.snjrw.org

http://chuangye.snjrw.org

http://gongsi.snjrw.org

http://baike.snjrw.org

http://zhishi.snjrw.org

http://wenxue.snjrw.org

http://yishu.snjrw.org

http://zhanlan.snjrw.org

http://huodong.snjrw.org

http://jiaoliu.snjrw.org

http://keti.snjrw.org

http://xueshu.snjrw.org

http://wenjian.snjrw.org

http://baogao.snjrw.org

http://shuju.snjrw.org

http://diaocha.snjrw.org

http://mingren.snjrw.org

http://jiemu.snjrw.org

http://shipin.snjrw.org

http://zhuanlan.snjrw.org

http://zhuanti.snjrw.org

http://wangzhan.snjrw.org

http://wangluo.snjrw.org

http://zhanzhang.snjrw.org

http://shichang.snjrw.org

http://guanli.snjrw.org

http://anquan.snjrw.org

http://jishu.snjrw.org

http://xiazai.snjrw.org

http://wenzhang.snjrw.org

请使用浏览器的分享功能分享到微信等