leetcode刷题/字符串 459. 重复的子字符串

459. 重复的子字符串

题意:

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

示例 1:

输入: "abab"
输出: True

解释: 可由子字符串 "ab" 重复两次构成。

示例 2:

输入: "aba"

输出: False

示例 3:

输入: "abcabcabcabc"

输出: True
解释: 可由子字符串 "abc" 重复四次构成。 (或者子字符串 "abcabc" 重复两次构成。)
解题思想:

利用KMP算法的next数组的特性,如果是重复的那么到第一次重复开始每次都增加1.这样到最后的一个就是重复字串的倍数.那么只需要判断是否符合就可以.

代码:
获取next数组
void getNext(string s, vector<int> &next)
{
	int j = 0;
	for (int i = 1; i < next.size(); i++)
	{
		while (j > 0 && s[i] != s[j])
			j = next[j - 1];
		if (s[i] == s[j])
			j++;
		next[i] = j;
	}
}
主函数
class Solution {
public:
    bool repeatedSubstringPattern(string s) {
	vector<int>next(s.size(), 0);
	getNext(s, next);

	int length = s.size();
	if (next[length - 1] != 0 && length % (length - next[length - 1]) == 0)
		return true;
	return false;
    }
};
运行结果:

运行结果

总结:

这道题我起初的想法是

  • 如果遇到与第一个一样的字符,那么截取后面部分相同的长度.
  • 然后比较是否相同,如果相同就直接返回true,不同就接着让左边的字符串扩大,直到最后一个字符.
  • 但是遇到类似于 acacd的时候,就失败了
    后面看到大佬用KMP做,然后就自己试着用之前做kmp的想法完成. 做出来不难,但是是真没想到.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

公仔面i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值