leetCode - 459. Repeated Substring Pattern

题目:

Given a non-empty string check if it can be constructed by taking a substring of it and appending multiple copies of the substring together. You may assume the given string consists of lowercase English letters only and its length will not exceed 10000.


思路与步骤:

思路如下:

1. 用一个变量存储 substring (后面通称 sub),该子集内容为 原string (后面通称 s) 的第一个字符起,到某个字符终止;

2. sub 的长度可以整除 s 的长度;通过这点即可以判断;

3. 所以难点是找到 sub 的终止字符,即 sub 的长度 sublen。

得到如下步骤:

第一步,给 sub 赋值,长度为 sublen;

第二步,依次判断 s 中每 sublen 长度的子串是否与 sub 相等;

第三步,判断 sublen 是否可以整除 s.length()

解决问题:

找不到sublen,只能用循环来判断。所以在上面三步的最外面加一层循环即可。此时问题变成由于多重循环效率较低,所以做如下改进。

在第一层循环中先判断整除关系;sublen 的长度从最大(s.length()/2 )开始。

别人的解法:

思路大体一致,但是在 s 与 sub 匹配中用到了 StringBuilder


编程实现:

public class Solution {
    public boolean repeatedSubstringPattern(String s) {
        int slen = s.length();
        if(slen == 1) return false;
        for(int sublen=slen/2; sublen > 0; sublen--){
            if(slen % sublen == 0){
                String subS = s.substring(0,sublen);
                int j = 0;  //s[j] is the first of subS, s[j,i+sublen] equals subS
                while(j<slen-sublen && s.substring(j,j+sublen).equals(subS))  j+=sublen;
                if(j==slen-sublen && s.substring(j,j+sublen).equals(subS))  return true;
            }
        }
        /*
        StringBuilder subSb = new StringBuilder();
        for(int sublen=1; sublen<=s.length()/2; sublen++){
            if(s.length()%sublen==0){
                subSb.delete(0,sublen-1);
                for(int i=0; i<sublen; i++) subSb.append(s.charAt(i));
                int j = 0;
                while(j<s.length()-sublen && s.substring(j,j+sublen).equals(subSb.toString()))  j+=sublen;
                if(j==s.length()-sublen && s.substring(j,s.length()).equals(subSb.toString()))  return true;
            }
        }*/
        return false;
    }
}

其中 j 的含义:subS 的第一个字母在 s 中的下标,也就是说 s[j,i+sublen] 等于 subS

改进的地方:

1. sublen 从最大值开始;

2. 虽然 sub 长度不确定,但是在每次循环时都是确定的,所以不需要用 StringBuilder,直接 String 即可。

别人的程序:

public class Solution {
    public boolean repeatedSubstringPattern(String s) {
        int slen = s.length();
        if(slen == 1) return false;
        for(int sublen=slen/2; sublen > 0; sublen--){
            if(slen % sublen == 0){
                int count = slen / sublen;
                String subS = s.substring(0,sublen);
                StringBuilder sb = new StringBuilder();
                for(int j=0; j < count; j++)    sb.append(subS);
		if(sb.toString().equals(s)) return true;
            }
        }
        return false;
    }
}

当然,这个程序效率并没有上面的高。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值