字符串移位包含

给定两个字符串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) //类型转化
}


转载于:https://my.oschina.net/yang1992/blog/548233

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值