|
| 1 | +func beautifulIndices(s string, a string, b string, k int) []int { |
| 2 | + |
| 3 | + |
| 4 | + s_len := len(s) |
| 5 | + a_len := len(a) |
| 6 | + b_len := len(b) |
| 7 | + |
| 8 | + final := make([]int, 0) |
| 9 | + lps_a := make([]int, a_len) |
| 10 | + lps_b := make([]int, b_len) |
| 11 | + a_index := make([]int, 0) |
| 12 | + b_index := make([]int, 0) |
| 13 | + |
| 14 | + var pat func(lps []int, s_l int, pattern string) |
| 15 | + |
| 16 | + pat = func(lps []int, s_l int, pattern string){ |
| 17 | + |
| 18 | + l := 0 |
| 19 | + lps[0] = 0 |
| 20 | + i := 1 |
| 21 | + |
| 22 | + for i < s_l { |
| 23 | + if pattern[i] == pattern[l] { |
| 24 | + l++ |
| 25 | + lps[i] = l |
| 26 | + i++ |
| 27 | + } else { |
| 28 | + if l != 0 { |
| 29 | + l = lps[l-1] |
| 30 | + } else { |
| 31 | + lps[i] = l |
| 32 | + i++ |
| 33 | + } |
| 34 | + } |
| 35 | + } |
| 36 | + } |
| 37 | + |
| 38 | + pat(lps_a, a_len, a) |
| 39 | + pat(lps_b, b_len, b) |
| 40 | + |
| 41 | + var kmp func(pat string, pat_l int, lps []int, index *[]int) |
| 42 | + |
| 43 | + kmp = func(pat string, pat_l int, lps []int, index *[]int){ |
| 44 | + i := 0 |
| 45 | + j := 0 |
| 46 | + for s_len - i >= pat_l - j { |
| 47 | + if s[i] == pat[j]{ |
| 48 | + i++ |
| 49 | + j++ |
| 50 | + } |
| 51 | + if j == pat_l{ |
| 52 | + *index = append(*index, i-pat_l) |
| 53 | + j = lps[j-1] |
| 54 | + } else if s[i] != pat[j] { |
| 55 | + if j!=0 { |
| 56 | + j = lps[j-1] |
| 57 | + } else { |
| 58 | + i++ |
| 59 | + } |
| 60 | + } |
| 61 | + } |
| 62 | + } |
| 63 | + |
| 64 | + kmp(a, a_len, lps_a, &a_index) |
| 65 | + kmp(b, b_len, lps_b, &b_index) |
| 66 | + |
| 67 | + // fmt.Println(a_index, b_index) |
| 68 | + |
| 69 | + i := 0 |
| 70 | + j := 0 |
| 71 | + |
| 72 | + for i < len(a_index) && j < len(b_index) { |
| 73 | + if a_index[i]+k >= b_index[j] && a_index[i]-k <= b_index[j]{ |
| 74 | + final = append(final, a_index[i]) |
| 75 | + i++ |
| 76 | + } else if a_index[i] - k > b_index[j]{ |
| 77 | + j++ |
| 78 | + } else { |
| 79 | + i++ |
| 80 | + } |
| 81 | + } |
| 82 | + |
| 83 | + return final |
| 84 | +} |
0 commit comments