当前位置: 首页 > news >正文

Go语言数据结构和算法(七)字符串匹配算法

字符串模式匹配也称为字符串搜索或字符串匹配,是在较大的文本或字符串中查找所有出现的模式的过程.模式可以是固定字符串或正则表达式,文本可以是任意字符串 文档或文件.

1.字符串模式匹配算法:

暴力算法:该算法将模式中的每个字符与文本中的每个字符进行比较,直到找到匹配项.

KMP算法:该算法通过使用有关模式信息在文本向前跳转.避免不必要的比较.

Boyer-Moore算法:该算法使用启发式算法根据模式的最后一个字符在文本中向前跳转.

Rabin-Karp算法:该算法使用散列函数快速将模式与文本中每个可能的字符串进行比较.

2.实现:

2.1方法:
func RabinKarpSearch(text string, pattern string) int {//计算文本和模式长度n := len(text)m := len(pattern)if n < m {return -1}//设置一个质数和幂变量prime := 101power := 1//计算模式的哈希值和文本第一个窗口hpattern := 0htext := 0for i := 0; i < m; i++ {hpattern = (hpattern*prime + int(pattern[i])) % primehtext = (htext*prime + int(text[i])) % prime}//计算素数的幂for i := 0; i < m-1; i++ {power = (power * prime) % prime}//将模式划过文本并检查匹配for i := 0; i <= n-m; i++ {//如果模式和文本的哈希值匹配,检查是否完全匹配if hpattern == htext {match := truefor j := 0; j < m; j++ {if pattern[j] != text[i+j] {match = falsebreak}}if match {return i}}//为下一次迭代更新文本窗口的哈希值.if i < n-m {htext = (prime*(htext-int(text[i])*power) + int(text[i+m])) % primeif htext < 0 {htext += prime}}}return -1
}
2.2main函数:
func main() {text := "I love Go algorithms,this is an example"pattern := "love"index := data.RabinKarpSearch(text, pattern)if index == -1 {fmt.Println("文本中找不到模式")} else {fmt.Println("文本中找到模式的索引是", index)}
}

3.实战:

3.1方法:
const primeRK = 16777619func SearchRabinKarp(text, pat string) int {n := len(text)m := len(pat)if n < m {return -1}var pow, thash, phash uint32pow = 1for i := 0; i < m-1; i++ {pow = (pow << 1) % primeRK}for i := 0; i < m; i++ {phash = (phash<<1 + uint32(pat[i])) % primeRKthash = (thash<<1 + uint32(text[i])) % primeRK}for i := 0; i <= n-m; i++ {if phash == thash {j := 0for ; j < m; j++ {if text[i+j] != pat[j] {break}}if j == m {return i}}if i < n-m {thash = ((thash-(pow*uint32(text[i])))<<1 + uint32(text[i+m])) % primeRKif thash < 0 {thash += primeRK}}}return -1
}
3.2main函数:
func main() {text := "I love Go algorithms,this is an example"pattern := "love"index := data.SearchRabinKarp(text, pattern)if index == -1 {fmt.Println("文本中找不到模式")} else {fmt.Println("文本中找到模式的索引是", index)}
}

人在桥上走.我在桥上坐.

http://www.dtcms.com/a/414631.html

相关文章:

  • 关于机器人的物理结构(连杆、关节、执行器)的快速入门介绍
  • C++进阶(1)——继承
  • 极简 Python 语言教程:从 Java 开发者视角入门实战
  • js 设计模式
  • Element前端黑马案例
  • ThingsBoard部署APP问题-GitHub无法访问
  • Day 27 - 使用 Tkinter 构建图形界面 (GUI) 与高级函数参数 - Python学习笔记
  • 学习Java第二十三天——苍穹外卖Day11-01~18
  • Cap‘n Web - JavaScript原生RPC系统
  • 东山县建设局网站烟台网站制作维护
  • 北京南站到北京站坐地铁几号线php+mysql网站开发技术与典型案例导航【源代码】
  • 使用Dlib库实现人脸识别,比opencv更加好用
  • Java RSA非对称加密与数字签名的安全数据传输
  • 【视觉SLAM十四讲】视觉里程计 1
  • Gnirehtet 教程:USB 数据线 电脑网络 反共享 Android设备
  • STM32启动流程解析:从BootROM到BootLoader
  • 网站文件目录wordpress find
  • 【Android之路】界面和状态交互
  • xget下载加速
  • 丝绸之路网站建设策划书如何用vc做网站
  • 【leetcode】35. 搜索插入位置
  • C++ —— 无锁队列
  • 具身智能:从理论到实践的深度探索与应用实践
  • 【算法】相交链表
  • Unity FairyGUI笔记
  • 【qml-11】Quick3D实现机器人欧拉旋转、拖动视角
  • 垂直网站建设步骤在线海报设计网站
  • PHP 8.2 vs PHP 8.3 对比:新功能、性能提升和迁移技巧
  • 做的好的阅读类的网站有哪些外贸seo软件
  • 安装MariaDB服务器流程介绍在Ubuntu 22.04系统