1668. 最大重复子字符串
动态规划
class Solution {
public:
int maxRepeating(string sequence, string word) {
int sequenceLength = sequence.length(), wordLength = word.length();
if(sequenceLength < wordLength){
return 0;
}
// 1. 确定状态含义:
// f[i]表示第i个位置作为结束位置,前wordLength长度的字符串是word时的最大重复值
// 如果前wordLength长度的字符串不是word,则f[i]=0,表示以i结束的字符串中最大重复值没有发生变化
vector<int> f(sequenceLength, 0);
// 2. base状态定义
// 如果sequence的前wordLength长度的字符串是word,那么f[wordLength - 1] = 1
if(sequence.substr(0, wordLength) == word){
f[wordLength - 1] = 1;
}
// 3. 状态转移
// 判断下标i前面的wordLength长度的字符串是否是word,如果是,f[i] = f[i - wordLength] + 1,否则值为0。
// f[i] = f[i - wordLength] + 1, valid = 1 && i >= wordLength
// f[i] = 0, otherwise
// 从sequence[wordLength]开始,判断前边每wordLength长度的字符串是否是word
for(int i = wordLength; i < sequenceLength; i++){
// 判断下标i前面的每wordLength长度的字符串是否是word。
bool valid = true;
for(int j = 0; j < wordLength; j++){
// 如果前边wordLength长度的字符串不是word,就说明以i结束的字符串中最大重复值没有发生变化
if(sequence[i - (wordLength - 1) + j] != word[j]){
valid = false;
break;
}
}
if(valid){
// 如果下标i前面的wordLength长度的字符串是否是word,则f[i] = f[i - wordLength] + 1,否则值为0。
f[i] = f[i - wordLength] + 1;
}
}
return *max_element(f.begin(), f.end());
}
};
class Solution {
public:
int maxRepeating(string sequence, string word) {
int sequenceLength = sequence.length(), wordLength = word.length();
if(sequenceLength < wordLength){
return 0;
}
// 1. 确定状态含义:
// f[i]表示第i个位置作为结束位置,前wordLength长度的字符串是word时的最大重复值
// 如果前wordLength长度的字符串不是word,则f[i]=0,表示以i结束的字符串中最大重复值没有发生变化
vector<int> f(sequenceLength, 0);
// 2. base状态定义
// 如果sequence的前wordLength长度的字符串是word,那么f[wordLength - 1] = 1
if(sequence.substr(0, wordLength) == word){
f[wordLength - 1] = 1;
}
// 3. 状态转移
// 判断下标i前面的wordLength长度的字符串是否是word,如果是,f[i] = f[i - wordLength] + 1,否则值为0。
// f[i] = f[i - wordLength] + 1, valid = 1 && i >= wordLength
// f[i] = 0, otherwise
// 从sequence[wordLength]开始,判断前边每wordLength长度的字符串是否是word
for(int i = wordLength; i < sequenceLength; i++){
// 判断下标i前面的每wordLength长度的字符串是否是word。
bool valid = true;
// 如果前边wordLength长度的字符串不是word,就说明以i结束的字符串中最大重复值没有发生变化
if(sequence.substr(i - wordLength + 1, wordLength) != word){
valid = false;
}
// 如果下标i前面的wordLength长度的字符串是否是word,则f[i] = f[i - wordLength] + 1,否则值为0。
if(valid){
f[i] = f[i - wordLength] + 1;
}
}
return *max_element(f.begin(), f.end());
}
};