1. 程式人生 > >Repeated Substring Paterm

Repeated Substring Paterm

題目描述:

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.

Example 1:

Input: "abab"

Output:
True Explanation: It's the substring "ab" twice.

Example 2:

Input: "aba"

Output: False

Example 3:

Input: "abcabcabcabc"

Output: True

Explanation: It's the substring "abc" four times. (And the substring "abcabc" twice.)
 
  
 

原題地址:

https://leetcode.com/problems/repeated-substring-pattern/#/description

刷題雜感:

刷這道題的過程還是一如既往:很快想到第一種做法,然後因為時間複雜度的原因撲街了,然後又嘗試了另一種更“簡潔”一點的演算法 /* == 我這樣的菜雞能想出來的最簡潔的做法了orz*/ 刷題越多,越覺得做題的時候要多想想再碼程式碼,得出正確的結果固然很棒,但是想出一個時間/空間複雜度較小的演算法更重要。 LeetCode的題目和Lintcode相比,難度可能相差不大,但是LeetCode的測試要求更高,所有程式碼經常撲街orz。還有就是英文Description有時候看不懂,必須配合著example一起看才能理解題意[誰讓我這個菜雞預備程式設計師英語姿勢水平不高呢] 共勉吧!希望能有一天可以徒手寫程式碼,肉眼debug!

第一種做法:

    public boolean repeatedSubstringPattern(String s) {
        boolean b = false;
        for(int i =1;i<=s.length()/2;i++){ //遍歷所有可能性
            String ele = s.substring(0,i); //子基字串
            int number = s.length()/ele.length();
            if(getNewString(ele,number).equals(s)){ //判斷根據子字串得出的新字串是否和原字串相等
                b = true;
                break;
            }
        }
        return b;
    }
    public String getNewString(String s,int m){
        String str = "";
        for(int i =0;i<m;i++){
            str = s+str;
        }
        return str;
    }

升級版的做法;

    public boolean repeatedSubstringPattern(String s) {
        boolean b = false;
        int length = 1;
        int i = length;
        while(i+length<=s.length()){
            String str = s.substring(0,length);  //確定基字串
            if(s.substring(i,length+i).equals(str)){  //判斷該字串是否為真-基字串
                if(s.length()%length==0){ //如果基字串能整除原字串,則為真
                    b = true;
                }
                i = i+length;
            }else{
                b = false;
                length++;
                i = length;
            }
        }
        return b;
    }