• 设为首页
  • 收藏本站
  • 积分充值
  • VIP赞助
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    福建二哥 门户 查看主题

    golang字符串匹配算法解读

    发布者: 涵韵3588 | 发布时间: 2025-8-14 05:57| 查看数: 83| 评论数: 0|帖子模式

    简介

    字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为模式串)。
    在 Golang 中,可以使用最常见的字符串匹配算法之一:Knuth-Morris-Pratt(KMP)算法,它的时间复杂度为 O(n+m),其中 n 和 m 分别为文本串和模式串的长度。

    KMP实现代码


    • mermaid解说图
    1. package main

    2. import "fmt"

    3. // KMP 算法用于在一个文本串中查找一个模式串
    4. // 其中,text 为文本串,pattern 为模式串
    5. // 返回值为模式串在文本串中第一次出现的位置,如果未找到,则返回 -1
    6. func kmp(text, pattern string) int {
    7.         n, m := len(text), len(pattern)
    8.         if m == 0 {
    9.                 return 0
    10.         }
    11.         if n < m {
    12.                 return -1
    13.         }

    14.         // 构建前缀表(partial match table)
    15.         pmt := make([]int, m)
    16.         for i, j := 1, 0; i < m; i++ {
    17.                 // 寻找最长公共前后缀的长度
    18.                 for j > 0 && pattern[i] != pattern[j] {
    19.                         j = pmt[j-1]
    20.                 }
    21.                 if pattern[i] == pattern[j] {
    22.                         j++
    23.                 }
    24.                 pmt[i] = j
    25.         }

    26.         // 在文本串中匹配模式串
    27.         for i, j := 0, 0; i < n; i++ {
    28.                 // 如果匹配不成功,利用前缀表来找到一个新的匹配位置
    29.                 for j > 0 && text[i] != pattern[j] {
    30.                         j = pmt[j-1]
    31.                 }
    32.                 // 如果匹配成功,则继续匹配下一个字符
    33.                 if text[i] == pattern[j] {
    34.                         j++
    35.                 }
    36.                 // 如果匹配成功,返回模式串在文本串中第一次出现的位置
    37.                 if j == m {
    38.                         return i - m + 1
    39.                 }
    40.         }
    41.         // 如果未找到,则返回 -1
    42.         return -1
    43. }

    44. func main() {
    45.         var num = kmp("韩实施一个如何使得覅上的换个地方韩浩", "韩浩")
    46.         fmt.Println(num)
    47. }
    复制代码
    在此实现中,我们首先构建了模式串的前缀表(partial match table,简称 pmt)。该表的每个元素表示模式串中前缀和后缀的最长公共部分的长度,即当模式串匹配到某个位置时,如果发生不匹配,则利用前缀表来找到一个新的匹配位置,以减少不必要的匹配操作。
    接着,我们在文本串中匹配模式串,如果匹配成功,则返回模式串在文本串中第一次出现的位置,否则返回 -1。
    使用 KMP 算法可以提高字符串匹配的效率,特别是当模式串较长时,它可以减少不必要的字符比较操作,从而提高匹配速度。

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

    来源:互联网
    免责声明:如果侵犯了您的权益,请联系站长(1277306191@qq.com),我们会及时删除侵权内容,谢谢合作!

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    ×

    最新评论

    QQ Archiver 手机版 小黑屋 福建二哥 ( 闽ICP备2022004717号|闽公网安备35052402000345号 )

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表