用途
求算子串在父串中位置
package main
import (
"errors"
"fmt"
)
func main() {
mainStr := "abcdeade"
subStr := "aa"
startPos,endPos,err := SlideWindow(mainStr,subStr)
if err != nil{
fmt.Println(err.Error())
}
fmt.Printf("startPos:%d,endPos:%d",startPos,endPos)
}
//滑动窗口寻找子串
func SlideWindow(mainStr,subsStr string)(startPos,endPos int,err error) {
mlen := len(mainStr)
slen := len(subsStr)
if mlen<slen{
return 0, 0, errors.New("子串长度不能大于父串")
}
minMatchSubStrLen := len(mainStr) //最小匹配子串长度
pStartPos := -1 //匹配到第一个字符位置
for i:=pStartPos+1;i<= mlen-slen;{
sOffset := 0 //子串游标位置+
for j:=i;j<mlen;j++{
if sOffset == 0{
pStartPos = j
i = pStartPos + 1
}
if mainStr[j] != subsStr[sOffset]{
//fmt.Printf("mainStr:%s,subsStr:%s\n",string(mainStr[j]),string(subsStr[sOffset]))
continue
}
//子串最后一个字母也匹配,此时达到完全匹配,计算已经匹配长度,即父串当前游标j-pStartPos,
// 如果该长度小于之前匹配子串长度,则进行收集写入startPos,endPos两个变量,记录匹配子串开始
// 与结束位置
//fmt.Printf("sOffset:%d",sOffset)
if sOffset >= slen-1{
if j-pStartPos<minMatchSubStrLen{
startPos = pStartPos
endPos = j
minMatchSubStrLen = j-pStartPos
}
break;
}
sOffset++ //子串向右移动一步
}
//fmt.Printf("pStartPos:%d\n",pStartPos)
}
return startPos,endPos,nil
}