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

當然,這個程序效率並沒有上面的高。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章