题目链接:leetcode 28. 实现 strStr()
文章讲解:代码随想录 28. 实现 strStr()讲解
思路和解法
这道题目的解法和思路非常复杂,我已经总结在了另一篇博客里:
KMP算法详解
题目链接:leetcode 459.重复的子字符串
文章讲解:代码随想录 459.重复的子字符串讲解
视频讲解:字符串这么玩,可有点难度! | LeetCode:459.重复的子字符串
思路和解法
题目:
给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。
示例 1:
输入: s = “abab”
输出: true
解释: 可由子串 “ab” 重复两次构成。
示例 2:
输入: s = “aba”
输出: false
示例 3:
输入: s = “abcabcabcabc”
输出: true
解释: 可由子串 “abc” 重复四次构成。 (或子串 “abcabc” 重复两次构成。)
想法: 这道题目的解题思路很巧妙,巧妙之处在于判断是否由重复子串构成的思路。
证明过程在文章讲解的链接里很充分了,建议先看我的 KMP算法详解 的文章,然后再看文章讲解,很容易理解,我自己看过以后写代码,对KMP算法理解的非常深刻。
class Solution {
public:
//实现计算前缀表
void getNext(int* next, const string& s) {
//初始化前缀表第一个值
next[0] = 0;
//模式串指针
int j = 0;
for (int i = 1; i < s.size(); i++) {
while (j > 0 && s[i] != s[j]) {
j = next[j -1];
}
if (s[i] == s[j]) {
j++;
}
next[i] = j;
}
}
bool repeatedSubstringPattern(string s) {
//创建前缀表
int next[s.size()];
//计算前缀表
getNext(next, s);
int len = s.size();
if (next[len - 1] != 0 && len % (len - next[len -1]) == 0) {
return true;
} else {
return false;
}
}
};