str.go 885 B

1234567891011121314151617181920212223242526272829303132333435363738
  1. package common
  2. func SundaySearch(text string, pattern string) bool {
  3. // 计算偏移表
  4. offset := make(map[rune]int)
  5. for i, c := range pattern {
  6. offset[c] = len(pattern) - i
  7. }
  8. // 文本串长度和模式串长度
  9. n, m := len(text), len(pattern)
  10. // 主循环,i表示当前对齐的文本串位置
  11. for i := 0; i <= n-m; {
  12. // 检查子串
  13. j := 0
  14. for j < m && text[i+j] == pattern[j] {
  15. j++
  16. }
  17. // 如果完全匹配,返回匹配位置
  18. if j == m {
  19. return true
  20. }
  21. // 如果还有剩余字符,则检查下一位字符在偏移表中的值
  22. if i+m < n {
  23. next := rune(text[i+m])
  24. if val, ok := offset[next]; ok {
  25. i += val // 存在于偏移表中,进行跳跃
  26. } else {
  27. i += len(pattern) + 1 // 不存在于偏移表中,跳过整个模式串长度
  28. }
  29. } else {
  30. break
  31. }
  32. }
  33. return false // 如果没有找到匹配,返回-1
  34. }