【51】459. Repeated Substring Pattern

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

转载于:https://www.cnblogs.com/93scarlett/p/6385165.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值