求给定子串的next[]数组
// nextArr 确定一个子串的next数组func nextArr(str string) []int {var slice = make([]int, 0)slice = append(slice, -1)for i := 2; i <= len(str); i++ {var j = 1for {prefix := str[:i-1-j]suffix := str[j : i-1]if prefix != "" && prefix == suffix {slice = append(slice, len(prefix))break}j++if j >= i {slice = append(slice, 0)break}}}return slice}
根据next数组及查找目标字符串位置
func FindStr(origin string, target string) int {if target == origin {return 0}if origin == "" {return -1}// next数组arr := nextArr(target)return findStr(origin, target, arr)}// findStr 私有查找字符串func findStr(str string, target string, arr []int) int {var i = 0var j = 0for {origin := str[i]t := target[j]if origin == t {i++j++} else {next := arr[j]if next < 0 {// 移动源字符串i++} else {// 移动模式串j = next}}if j == len(target) || i == len(str) {break}}if j == len(target) {return i - len(target)} else {return -1}}
demo
func main() {var str = "abcababcdsdohjd"var target = "ababcd"arr := nextArr(target)fmt.Println("next数组:", arr)//index := FindStr(str, target)if index < 0 {fmt.Println("未找到目标字符串!")} else {fmt.Println("找到目标字符串,起始位置index = ", index)}}
