Golang实现的KMP字符串匹配算法

前端之家收集整理的这篇文章主要介绍了Golang实现的KMP字符串匹配算法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

算法的细节可以参考网上的资料或数据结构的相关教材,这里直接上代码了~

鉴于本人技艺浅陋,有的地方写的可能不合理,代码略长,如果有改进之处,请留言指点,算法本身测试过了:

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. )
  6.  
  7. func GetNextValueArray(sub []byte) (next []int) {
  8. var (
  9. length int = len(sub)
  10. middle int
  11. compare_left int
  12. compare_right int
  13. match_count int
  14. )
  15.  
  16. next = make([]int,length)
  17. next[0] = 0
  18. next[1] = 0
  19.  
  20. for i := 2; i < length; i++ {
  21. middle = i / 2
  22. match_count = 0
  23.  
  24. if i%2 == 0 {
  25. for j := 0; j < middle; j++ {
  26. compare_left = 0
  27. compare_right = i - 1 - j
  28. for compare_left <= j {
  29. if sub[compare_left] != sub[compare_right] {
  30. break
  31. }
  32. compare_left++
  33. compare_right++
  34. }
  35. if compare_left == j+1 {
  36. match_count++
  37. }
  38. }
  39. next[i] = match_count
  40.  
  41. } else {
  42. for j := 0; j <= middle; j++ {
  43. compare_left = 0
  44. compare_right = i - 1 - j
  45. for compare_left <= j {
  46. if sub[compare_left] != sub[compare_right] {
  47. break
  48. }
  49. compare_left++
  50. compare_right++
  51. }
  52. if compare_left == j+1 {
  53. match_count++
  54. }
  55. }
  56. next[i] = match_count
  57. }
  58. }
  59.  
  60. return next
  61. }
  62.  
  63. func ReviseNextValueArray(next []int) []int {
  64. var length int = len(next)
  65. for i := 2; i < length; i++ {
  66. if next[i] == next[next[i]] {
  67. next[i] = next[next[i]]
  68. }
  69. }
  70.  
  71. return next
  72. }
  73.  
  74. //在content中的start-end之间寻找sub子串
  75. //成功返回匹配成功的起始下标,匹配失败则返回-1
  76. func KMP(content []byte,start_index int,end_index int,sub []byte) (index int) {
  77. var (
  78. next []int = ReviseNextValueArray(GetNextValueArray(sub))
  79. sub_index int = 0
  80. sub_length int = len(sub)
  81. )
  82. for i := start_index; i <= end_index; i++ {
  83. if content[i] == sub[sub_index] {
  84. match_start := i
  85. for j := sub_index; j <= sub_length; j++ {
  86. if j == sub_length {
  87. return match_start - sub_index
  88. }
  89. if i >= end_index || content[i] != sub[j] {
  90. sub_index = next[j]
  91. break
  92. }
  93. i++
  94. }
  95. }
  96. }
  97.  
  98. return -1
  99. }
  100.  
  101. func main() {
  102. content := []byte("why every programming language use the hello world as the first test???")
  103. sub := []byte("hello world")
  104. fmt.Println(KMP(content,len(content)-1,sub))
  105. }




如果转载请注明出处:http://blog.csdn.net/gophers/article/details/23128345

猜你在找的Go相关文章