代码随想录算法训练营第九天|[28].找出字符串中第一个匹配项的下标、[459].重复的子字符串

//kmp 今天的比较难先简单过一遍不死扣了 等周末复习的时候再扣一下

[28].找出字符串中第一个匹配项的下标

func strStr(haystack string, needle string) int {
	n:= len(needle)
	if n == 0{
		return 0
	}
	j := 0
	next:=make([]int, n)
	getNext(next,needle)
	for i := 0; i < len(haystack); i++ {
		for j>0 && haystack[i] != needle[j]{
			j = next[j-1]
		}
		if haystack[i] == needle[j]{
			j++
		}
		if j == n{
			return i - j +1
		}
		
	}
	return -1

}

func getNext(next []int,s string){
	j:=0
	next[0]= j
	for i := 1; i < len(s); i++ {
		for j > 0 && s[i] != s[j] {
			j = next[j-1]
		}
		if s[i] == s[j]{
			j++
		}
		next[i] = j
	}
}

[459].重复的子字符串

func repeatedSubstringPattern(s string) bool {
	//如果是重复字符串组成比如 abcabc  那么我 去头去尾连上 
	//bcabc abcab
	//组成 bc abc abc ab 中间还会出现这个字符串那么就说明可以由这个组成
	str:=[]byte(s)
	ss:=string(str[1:])+string(str[:len(str)-1])
	return strings.Contains(ss,s)

}

func repeatedSubstringPattern(s string) bool {
	n:=len(s)
	if n== 0{
		return false
	}
	j := 0 
	next:= make([]int, len(s))
	next[0] = 0
	for i := 1; i < n; i++ {
		for j>0 && s[i]!=s[j]{
			j = next[j-1]
			
		}
		if s[i]==s[j]{
			j++
		}
		next[i]=j
	}
	// next[n-1] 是最小前后缀的长度
	if next[n-1]!=0&& n%(n-next[n-1])==0{
		return true
	}
	return false
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值