【近日力扣】重复的子字符串

重复的子字符串(字符串,简单)

给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。

  • 思路一(不推荐):枚举,将所有长度的子字符串 s 都列出来,挨个在原字符串 n 里遍历,看是否一直重复到末尾。稍微可以优化的两个点:能重复的 s 长度一定小于 n 的一半;只有长度能被 n 整除的 s 才实现重复
var repeatedSubstringPattern = function(s) {
    let n = s.length
    // 设定长度为 i 的字符串
    for (let i = 1; i < n / 2; i++) {
    	if (n % i === 0) {
    		let match = true
    		// 遍历 i 长度的子字符串是否重复
    		for (let j = i; j < n; j++) {
    			if (s.charAt(j) !== s.charAt(j - i)) {
    				match = false
    			}
    		}
    		if (match) return true
    	}
    }
    return false
};
  • 思路二:比较巧妙
    • 利用移位,每次首字母移到末尾,如果某次移位后等于 n,则说明重复。例如 ababab,移位一次:bababa,移位两次:ababab,等于原字符串,说明重复。最差的情况是 s 只重复两次,且 n 又特别长的时候,意味着得移位 n 一半长度的次数
    • 再次优化,如果令 str 等于 n + n,也就是 str 包含了所有移位情况,比如:若不重复,n = abc,str = abcabc,则str 包含了 a(bca)bc,ab(cab)c,abc(abc)这三种移位情况;若重复,n = abab,str = abababab,有 a(baba)bab,ab(abab)ab 两种移位情况。所以如果 n 是重复的,则 str 去掉头尾字符串一定包含 n 本身这种情况,那么代码显而易见了
var repeatedSubstringPattern = function(s) {
    let str = s + s
    // substring 去掉头尾
    return str.substring(1, str.length - 1).includes(s)
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值