开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第22天,点击查看活动详情
一、题目描述:
给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。
示例 1:
输入: s = "abab"
输出: true
解释: 可由子串 "ab" 重复两次构成。
示例 2:
输入: s = "aba"
输出: false
示例 3:
输入: s = "abcabcabcabc"
输出: true
解释: 可由子串 "abc" 重复四次构成。 (或子串 "abcabc" 重复两次构成。)
提示:
- 1 <= s.length <= 10^4
- s 由小写英文字母组成
二、思路分析:
假设字符串s是由s1+s2组成的,s+s后,str就变成了s1+s2+s1+s2,去掉首尾,破环了首尾的s1和s2,变成了s3+s2+s1+s4,此时str中间就是s2+s1,如果s是循环字串,也就是s1=s2,所以str中间的s2+s1就和原字符串相等。如果s不是循环字串,s1!=s2,那么s1+s2是不等于s2+s1的,也就是str中间不包含s。 如果只破坏了字符串首,那么就变成了s3+s2+s1+s2,新字符串中又出现了s1+s2,所以无法判断原字符串s是否可重复。只破坏字符串尾部也是一样的道理,所以要去掉首尾。
三、AC 代码:
/**
* @param {string} s
* @return {boolean}
*/
var repeatedSubstringPattern = function(s) {
const len = s.length;
const mid = Math.floor(len / 2);
for (let i = 1; i <= mid; i++) {
if (len % i === 0) {
let sub = s.substring(0, i);
if (sub.padEnd(len, sub) === s) {
return true;
}
}
}
return false;
};
四、总结:
暴力的话 时间复杂度太高了
范文参考:
「代码随想录」带你搞定字符串!459. 重复的子字符串:【KMP经典问题】 - 重复的子字符串 - 力扣(LeetCode)