++字符串模式匹配也称为字符串搜索或字符串匹配,是在较大的文本或字符串中查找所有出现的模式的过程.模式可以是固定字符串或正则表达式,文本可以是任意字符串 文档或文件.++
++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)
}
}
++人在桥上走.我在桥上坐.++