str.go 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  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. }
  35. func RemoveDuplicate(s []string) []string {
  36. result := make([]string, 0, len(s))
  37. temp := map[string]struct{}{}
  38. for _, item := range s {
  39. if _, ok := temp[item]; !ok {
  40. temp[item] = struct{}{}
  41. result = append(result, item)
  42. }
  43. }
  44. return result
  45. }