leetcode 459. 重复的子字符串(Java版)

布满荆棘的人生 2023-01-18 04:07 310阅读 0赞

题目

https://leetcode-cn.com/problems/repeated-substring-pattern/
在这里插入图片描述

思路

暴力解法 + 剪枝优化

经过尝试,如果直接使用暴力解法会超时,于是想到了一种剪枝的方式:

假设子串的长度为 step,原串的长度为 length。从直观上来看,原串的长度必然为子串长度的倍数,即,只有当 length%step==0 时,才有可能成为正确的子串。根据这个结论,进行剪枝优化。

代码

评论区说,简单题就是暴力解能通过的题。本文用的暴力解,优化之后才勉强 AC。

  1. class Solution {
  2. public static boolean repeatedSubstringPattern(String s) {
  3. char[] charArray = s.toCharArray();
  4. int step = 0;
  5. while (step < s.length() / 2) { // 遍历每个步长
  6. step++;
  7. // 剪枝优化
  8. while (charArray.length % step != 0) {
  9. step++;
  10. }
  11. // 当前步长是否能匹配
  12. int i, j;
  13. for (i = 0, j = 0; i < charArray.length; i++, j++) {
  14. j %= step;
  15. if (charArray[i] != charArray[j]) break;
  16. }
  17. if (i == charArray.length && charArray.length % step == 0 && step < s.length()) {
  18. return true;
  19. }
  20. }
  21. return false;
  22. }
  23. }

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,310人围观)

还没有评论,来说两句吧...

相关阅读

    相关 459. 重复字符串

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