leetcode算法459. 重复的子字符串

88 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第11天,点击查看活动详情

一、题目描述:

459. 重复的子字符串 - 力扣(LeetCode)

给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。

示例 1:

输入: s = "abab"
输出: true
解释: 可由子串 "ab" 重复两次构成。

示例 2:

输入: s = "aba"
输出: false

示例 3:

输入: s = "abcabcabcabc"
输出: true
解释: 可由子串 "abc" 重复四次构成。 (或子串 "abcabc" 重复两次构成。)

提示:

  • 1 <= s.length <= 10^4
  • s 由小写英文字母组成

二、思路分析:

自己写的一个小方法,可能很多大佬都会,可能写的不好,只是简单分享,欢迎指教,狗头保命。 可能算是个双指针法吧,判定的标准就是是否与第一个字符相等,然后以相等字符为起点,循环验证是否全部是重复子串
一个重点在于flag的意义,因为在验证是否重复子字符串时可能会重复出现相等于第一个字符的位置,出现的话这个位置就是验证失败之后新的起点,避免跳过验证点的情况。

三、AC 代码:

class Solution {
public:
	bool repeatedSubstringPattern(string s) {
		if (s.size() == 1) return false;
		int n = s.size();
		int m = 0;//重复字符串的尾
		for (int i = 1; i < n; ++i)
		{
			if (s[0] == s[i])
			{
				for (int j = i, k = 0, flag = 0; j < n; ++j)
				{
					if (j > i && s[j] == s[0]) flag = j - 1;
					if (s[j] != s[k])//不是重复字符串
					{
						if (flag)
						{
							i = m = flag;
							break;
						}
						else
						{
							i = m = j;
							break;
						}						
					}					
					if (j == n - 1 && k == m)return true;
					if (k == m)
					{
						k = 0;
						continue;
					}
					++k;
				}				
			}
			else ++m;
		}
		return false;
	}
};

参考

KMP in Python | prefix表不整体减1 - 重复的子字符串 - 力扣(LeetCode)

459. 重复的子字符串 [KMP算法] - 重复的子字符串 - 力扣(LeetCode)

KMP算法,这道题直接看代码随想录里头,很费解,我现在还没看懂 - 重复的子字符串 - 力扣(LeetCode)