459. Repeated Substring Pattern
Description Submission Solutions Add to List
- Total Accepted: 18093
- Total Submissions: 46637
- Difficulty: Easy
- Contributors: YuhanXu
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.)
Solution 1:
1 class Solution { 2 public: 3 bool repeatedSubstringPattern(string str) { 4 int n = str.size(); 5 for(int i = n/2; i >= 1; i--){//从中间往前遍历,如果是重复子字符串,后面拼接起来肯定等于原string 6 int c = 0; 7 string s = ""; 8 if(n % i == 0){ 9 c = n / i;//c是指:c个从零到i- 1的子字符串可以拼成原string 10 } 11 for(int j = 0; j < c; j++){ 12 13 s += str.substr(0, i); 14 } 15 if(s == str){ 16 return true; 17 } 18 } 19 return false; 20 } 21 };
Solution 2:
//维护的一位数组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]是一个子字符串的长度,那么重复字符串的长度和肯定是一个子字符串的整数倍
1 class Solution { 2 public: 3 //维护的一位数组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]是一个子字符串的长度,那么重复字符串的长度和肯定是一个子字符串的整数倍 4 bool repeatedSubstringPattern(string str) { 5 int i = 1; 6 int j = 0;//j一直在i的后面,表示第j个字符和第i个字符是相等的 7 int n = str.size(); 8 vector<int> dp(n + 1, 0); 9 while(i < n){ 10 if(str[i] == str[j]){ 11 dp[++i] = ++j;//意思是到目前为止重复的子字符串的长度 12 }else if(j == 0){ 13 ++i;//j还在第一个 且不相等 i继续往后走 14 }else{ 15 j = dp[j]; 16 } 17 } 18 return dp[n] && (dp[n] % (n - dp[n]) == 0); 19 } 20 };
class Solution {public://维护的一位数组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]是一个子字符串的长度,那么重复字符串的长度和肯定是一个子字符串的整数倍 bool repeatedSubstringPattern(string str) { int i = 1; int j = 0;//j一直在i的后面,表示第j个字符和第i个字符是相等的 int 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;//j还在第一个 且不相等 i继续往后走 }else{ j = dp[j]; } } return dp[n] && (dp[n] % (n - dp[n]) == 0); }};