每日一题算法:2020年8月24日[重复的子字符串] repeatedSubstringPattern

2020年8月24日重复的子字符串 repeatedSubstringPattern

在这里插入图片描述

class Solution {
    public boolean repeatedSubstringPattern(String s) {

    }
}

解题思路:

根据题意,这个字符串中只能包含某一特定字符串,不能包含除该字符串以外的其他字符串,这就意味着符合条件的字符串必定符合以下特性。

如果是一个偶数长度的字符串并且符合条件,那么他必定是由偶数个相同的字符串组成,因为是偶数个,所以也可以认为是由两个字符串组成的,所以我们只需要由中间分开,再判断两边的字符串是否相等即可。

如果是一个奇数,我们可以先求出所有的约数,这两个约数必定就是两个奇数,我们尝试找出所有的约数作为子字符串的长度来尝试是否字符串相等。

代码实现:
在这里插入图片描述

在使用代码编写的过程中发现了之前的思路的错误之处,如果长度为偶数并不能直接分为左右两个子字符串,因为可能存在"ababab"这种情况,在改正之后把偶数的解法和奇数的解法统一了一下,还是使用寻找约数的方式来减少测试的次数。

public boolean repeatedSubstringPattern(String s) {
        int len=s.length();

            for (int i=1;i<=len/2;i++){
                //如果能够整除,说明是一个约数,进行尝试,假设这个子字符串长度为i
                if (len%i==0){

                    //循环i次,比较每一个字符
                    for (int j=0;j<i;j++){
                        char c=s.charAt(j);
                        int num=0;
                        for (int x=1;x<len/i;x++){

                            //统计不相同的个数
                            if (s.charAt(x*i+j)!=c)
                                num++;
                        }

                        if (num>0)
                            break;
                        if (j==i-1&&num==0)
                            return true;
                    }
                }
            }

        return false;
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值