[Leetcode][第459题][JAVA][重复的字符串][子串][匹配]

超、凢脫俗 2022-11-30 12:28 311阅读 0赞

【问题描述】[中等]

在这里插入图片描述

【解答思路】

1. 枚举

找出能整除的子串长度,再用substring遍历匹配即可
时间复杂度:O(N^2) 空间复杂度:O(1)

  1. class Solution {
  2. public boolean repeatedSubstringPattern(String s) {
  3. int len = s.length();
  4. for(int i = 1 ;i<=len/2;i++){
  5. String sub = s.substring(0,i);
  6. int lenSub = sub.length();
  7. int count =0 ;//统计字段数 正确的话应该有 d-1
  8. int d = 0; //一共有多少段
  9. if(len%lenSub ==0){
  10. d = len/lenSub -1;
  11. for(int j=i;j+lenSub<=len;j+=lenSub){
  12. String sub2 = s.substring(j,j+lenSub);
  13. if(sub.equals(sub2)){
  14. count++;
  15. }
  16. }
  17. if(count == d){
  18. return true;
  19. }
  20. }
  21. }
  22. return false;
  23. }
  24. }

优化 子串 flag

  1. class Solution {
  2. public boolean repeatedSubstringPattern(String s) {
  3. for(int i = 1; i < s.length(); ++i){
  4. if(s.length()%i == 0){
  5. String t = s.substring(0, i);
  6. boolean flag = true;
  7. for(int j = i; j + i <= s.length(); j += i){
  8. if(!t.equals(s.substring(j, j + i))){
  9. flag = false;
  10. break;
  11. }
  12. }
  13. if(flag) return true;
  14. }
  15. }
  16. return false;
  17. }
  18. }

优化 逐个比较
在这里插入图片描述

  1. class Solution {
  2. public boolean repeatedSubstringPattern(String s) {
  3. int n = s.length();
  4. for (int i = 1; i * 2 <= n; ++i) {
  5. if (n % i == 0) {
  6. boolean match = true;
  7. for (int j = i; j < n; ++j) {
  8. if (s.charAt(j) != s.charAt(j - i)) {
  9. match = false;
  10. break;
  11. }
  12. }
  13. if (match) {
  14. return true;
  15. }
  16. }
  17. }
  18. return false;
  19. }
  20. }
2. 字符串匹配

在这里插入图片描述

  1. class Solution {
  2. public boolean repeatedSubstringPattern(String s) {
  3. return (s + s).indexOf(s, 1) != s.length();
  4. }
  5. }

【总结】

1. 扩展思路 KMP算法
2.思路二正确性证明

在这里插入图片描述
在这里插入图片描述

3.优化细节

3.1 子串长度至多等于原字符串除以2
3.2 flag标志+ break提前终止

转载链接:https://leetcode-cn.com/problems/repeated-substring-pattern/solution/zhong-fu-de-zi-zi-fu-chuan-by-leetcode-solution/
参考链接:https://leetcode-cn.com/problems/repeated-substring-pattern/solution/zhong-fu-de-zi-zi-fu-chuan-by-leetcode-solution/

发表评论

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

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

相关阅读

    相关 459. 重复字符串

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