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

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

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

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

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

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

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

++2.实现:++

++2.1方法:++
Go 复制代码
func RabinKarpSearch(text string, pattern string) int {
	//计算文本和模式长度
	n := len(text)
	m := len(pattern)
	if n < m {
		return -1
	}
	//设置一个质数和幂变量
	prime := 101
	power := 1
	//计算模式的哈希值和文本第一个窗口
	hpattern := 0
	htext := 0
	for i := 0; i < m; i++ {
		hpattern = (hpattern*prime + int(pattern[i])) % prime
		htext = (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 := true
			for j := 0; j < m; j++ {
				if pattern[j] != text[i+j] {
					match = false
					break
				}
			}
			if match {
				return i
			}
		}
		//为下一次迭代更新文本窗口的哈希值.
		if i < n-m {
			htext = (prime*(htext-int(text[i])*power) + int(text[i+m])) % prime
			if htext < 0 {
				htext += prime
			}
		}
	}
	return -1
}
++2.2main函数:++
Go 复制代码
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方法:++
Go 复制代码
const primeRK = 16777619

func SearchRabinKarp(text, pat string) int {
	n := len(text)
	m := len(pat)
	if n < m {
		return -1
	}
	var pow, thash, phash uint32
	pow = 1
	for i := 0; i < m-1; i++ {
		pow = (pow << 1) % primeRK
	}

	for i := 0; i < m; i++ {
		phash = (phash<<1 + uint32(pat[i])) % primeRK
		thash = (thash<<1 + uint32(text[i])) % primeRK
	}

	for i := 0; i <= n-m; i++ {
		if phash == thash {
			j := 0
			for ; 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])) % primeRK
			if thash < 0 {
				thash += primeRK
			}
		}
	}
	return -1
}
++3.2main函数:++
Go 复制代码
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)
	}
}

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

相关推荐
前端小白在前进18 分钟前
力扣刷题:千位分割数
javascript·算法·leetcode
free-elcmacom20 分钟前
机器学习高阶教程<11>当数据开始“折叠”:流形学习与深度神经网络如何发现世界的隐藏维度
人工智能·python·神经网络·学习·算法·机器学习·dnn
小年糕是糕手24 分钟前
【C/C++刷题集】string类(一)
开发语言·数据结构·c++·算法·leetcode
努力学算法的蒟蒻29 分钟前
day40(12.21)——leetcode面试经典150
算法·leetcode·面试
ToddyBear31 分钟前
从字符游戏到 CPU 指令集:一道算法题背后的深度思维跃迁
数据结构·算法
光影少年34 分钟前
前端算法新手如何刷算法?
前端·算法
Andyshengwx44 分钟前
图论 最小生成树 MST问题
c++·算法·图论
賬號封禁中miu1 小时前
图论之最小生成树
java·数据结构·算法·图论
闻缺陷则喜何志丹1 小时前
【图论 拓扑排序 贪心 临项交换】P5603 小 C 与桌游 题解|普及+
c++·算法·图论·贪心·拓扑排序·洛谷·临项交换
闻缺陷则喜何志丹1 小时前
【图论 BFS染色 并集查找 】P3663 [USACO17FEB] Why Did the Cow Cross the Road III S|普及+
c++·算法·图论·染色法·宽度优先·并集查找