leetCode

来源:互联网 发布:唐勇的seo分享平台 编辑:程序博客网 时间:2024/06/15 03:37

题目:

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;    }}

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


0 0