[LeetCode] 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.html

Example 1:java

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

 

這道題給了咱們一個字符串,問其是否能拆成n個重複的子串。那麼既然能拆分紅多個子串,那麼每一個子串的長度確定不能大於原字符串長度的一半,那麼咱們能夠從原字符串長度的一半遍歷到1,若是當前長度能被總長度整除,說明能夠分紅若干個子字符串,咱們將這些子字符串拼接起來看跟原字符串是否相等。 若是拆完了都不相等,返回false。app

 

解法一:post

class Solution {
public:
    bool repeatedSubstringPattern(string str) {
        int n = str.size();
        for (int i = n / 2; i >= 1; --i) {
            if (n % i == 0) {
                int c = n / i;
                string t = "";
                for (int j = 0; j < c; ++j) {
                    t += str.substr(0, i); 
                }
                if (t == str) return true;
            }
        }
        return false;
    }
};

 

下面這種方法是參考的網上的這個帖子,原做者說是用的KMP算法,LeetCode以前也有一道應用KMP算法來解的題Shortest Palindrome,可是感受那道題纔是KMP算法。這道題也稱爲KMP算法感受怪怪的(關於KMP的詳細介紹請參見從頭至尾完全理解KMP,也能夠看博主本身寫的一篇KMP Algorithm 字符串匹配算法KMP小結),KMP算法中的next數組是找當前位置的最大相同前綴後綴的個數,而這道題維護的一位數組dp[i]表示,到位置i-1爲止的重複字符串的字符個數,不包括被重複的那個字符串,什麼意思呢,咱們舉個例子,好比"abcabc"的dp數組爲[0 0 0 0 1 2 3],dp數組長度要比原字符串長度多一個。那麼咱們看最後一個位置數字爲3,就表示重複的字符串的字符數有3個。若是是"abcabcabc",那麼dp數組爲[0 0 0 0 1 2 3 4 5 6],咱們發現最後一個數字爲6,那麼表示重複的字符串爲「abcabc」,有6個字符。那麼怎麼經過最後一個數字來知道原字符串是否由重複的子字符串組成的呢,首先固然是最後一個數字不能爲0,並且還要知足dp[n] % (n - dp[n]) == 0才行,由於n - dp[n]是一個子字符串的長度,那麼重複字符串的長度和確定是一個子字符串的整數倍,參見代碼以下:url

 

解法二:spa

class Solution {
public:
    bool repeatedSubstringPattern(string str) {
        int i = 1, j = 0, n = str.size();
        vector<int> dp(n + 1, 0);
        while (i < n) {
            if (str[i] == str[j]) dp[++i] = ++j;
            else if (j == 0) ++i;
            else j = dp[j];
        }
        return dp[n] && (dp[n] % (n - dp[n]) == 0);
    }
};

 

相似題目:.net

Implement strStr()code

Repeated String Match

 

參考資料:

https://discuss.leetcode.com/topic/68498/one-line-with-regex/2

https://discuss.leetcode.com/topic/67992/java-simple-solution-with-explanation

 

LeetCode All in One 題目講解彙總(持續更新中...)

相關文章
相關標籤/搜索