给定两个字符串s1,s2
要求判定s2是否能被s1作循环移位(rotate)得到的字符串包含。
例如给定s1=AABCD和s2=CDAA,返回true,给定s1=ABCD,s2=ACBD,则返回false
O(s1)=N O(s2)=M N>=M 不然直接false
方法一:直接进行N移位,然后进行M次比较,时间复杂度为O(N^2)
方法二:copy(news1,s1+s1),则规律明显,如果s2被移位的s1包含,则s2必定被news1包含
package main
import (
"fmt"
"strings"
)
//判断des是否是src子串
func is_contain(src string, des string) bool {
len1 := len(src)
len2 := len(des)
if len1 < len2 {
return false
}
flag := false
var i, j int
for i = 0; i < len1; i++ {
k := i
for j = 0; j < len2 && k < len1; j++ {
if src[k] != des[j] {
break
}
k++
}
if j == len2 {
flag = true
}
}
return flag
}
func move_contain(src string, des string) bool {
newsrc := strings.Join([]string{src, src}, "")
return is_contain(newsrc, des)
}
func main() {
fmt.Printf("str %s is %v contain %s\n", "AABCD", move_contain("AABCD", "CDAA"), "CDAA")
}
然后再来看看strings.Join函数的操作:
func Join(a []string, sep string) string {
if len(a) == 0 {
return ""
}
if len(a) == 1 {
return a[0]
}
n := len(sep) * (len(a) - 1)
for i := 0; i < len(a); i++ {
n += len(a[i])
}
b := make([]byte, n) // make + copy操作
bp := copy(b, a[0])
for _, s := range a[1:] {
bp += copy(b[bp:], sep)
bp += copy(b[bp:], s)
}
return string(b) //类型转化
}