1. 程式人生 > >leetcode_459. Repeated Substring Pattern 重複子串模式,判斷某個字串能否由某個字串重複若干次組成

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.

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.)

題意:

給定非空字串,檢查它是否可以由它的一個子串重複若干次組成。 假定給定的字串僅由小寫英文字母組成,其長度不超過10000。

程式碼:

public class Solution {
    public boolean repeatedSubstringPattern(String str) {
        int i;
        int n = str.length();
        int m;
        int flag=0;      
        
        for(i=n/2; i>=1; i--){     //i為原字串的可重複子串的子串的長度;對每種可能長度的子串進行遍歷,i為子串長度。
            if( n%i == 0 ){         //n%i == 0:長度為i的子串可以切分str,否則,str的長度不能整除i,表示str就不可能由若干子串重複組成
                m = n/i;            //m: str中長度為i的子串的個數     
                
                for(int j=0; j <i; j++){      //比較m個長度為i的子串是否相等,j遍歷子串的每個字元
                    flag=0;                 //標記所有子串所有元素是否相等
                    for(int k=1;k<m;k++) {          //k遍歷所有子串
                        if(str.charAt(j) != str.charAt(j+k*i)){        //比較子串的第j個位置的字元是否相等
                            flag = 1;                                  //如果不等,則退出比較,當前子串長度i的劃分不滿足要求,結束,更新i,進行下一次的搜尋
                            break;
                        }
                    }
                    if(flag == 1) {
                        break;
                    }
                }
                
             if(flag == 0){        //如果當前子串長度為i的劃分,能夠使每個子串都相等,則滿足要求,返回true       
                 return true;
             }
             
            }
        }
        return false;               //如果子串長度i的所有劃分都不滿足要求,則返回flase,表示該字串不能由某個子串的若干倍組成
    }
}

筆記:

1、java的string類的字串str,獲取第j個位置的字元,要用str.charAt(j)來實現;(感覺好麻煩)

2、java的bool變數的取值是小寫的:true、flase;記住是小寫,跟python不同。

程式碼2:

public class Solution {
    public boolean repeatedSubstringPattern(String str) {
        int i,j;
        int n = str.length();
        int m;
        int flag=0;
        
        for(i=n/2; i>=1; i--){     //i為原字串的可重複子串的子串的長度
            if( n%i == 0 ){         //n%i == 0:長度為i的子串可以切分str,否則,str的長度不能整除i,表示str就不可能由若干子串重複組成
                m = n/i;            //m: str中長度為i的子串的個數 
                
                String substr1 = str.substring(0,i);            //比較每個子串是否相等,substr1為第一個子串   
                
                for(j=1; j<m; j++){                             
                    String substr2 = str.substring(j*i,(j+1)*i);            //substr2為遍歷的其他子串
                    if(!substr1.equals(substr2)) {                            //判斷substr1與substr2是否相等
                        break;                                                    //如果不等,則跳出迴圈
                    }
                }
                if(j==m){                                   //如果全部比較完才跳出上面的迴圈,此時j==m,則表示能找到一個子串,重複若干次變成str,返回true
                    return true;                           
                }     
            }
        }
        return false;               //如果子串長度i的所有劃分都不滿足要求,則返回flase,表示該字串不能由某個子串的若干倍組成
    }
}

筆記:

1、string型別擷取子串的函式:str.substring(0,i);擷取子串的位置從0開始,到i-1結束,長度為i;

所以,substring的引數是(起始位置,終止位置+1)

2、判斷兩個string型別的字串是否相等,用substr1.equals(substr2),返回true,則相等;否則不相等。