466.統計重複個數
定義由 n 個連線的字串 s 組成字串 S,即 S = [s,n]
。例如,["abc", 3]
=“abcabcabc”。
另一方面,如果我們可以從 s2 中刪除某些字元使其變為 s1,我們稱字串 s1 可以從字串 s2 獲得。例如,“abc” 可以根據我們的定義從 “abdbec” 獲得,但不能從 “acbbe” 獲得。
現在給出兩個非空字串 S1 和 S2(每個最多 100 個字元長)和兩個整數 0 ≤ N1 ≤ 106 和 1 ≤ N2 ≤ 106。現在考慮字串 S1 和 S2,其中S1=[s1,n1]
S2=[s2,n2]
。找出可以使[S2,M]
從 S1
獲得的最大整數 M。
示例:
輸入:
s1 ="acb",n1 = 4
s2 ="ab",n2 = 2
返回:
2
class Solution {
public:
int getMaxRepetitions(string s1, int n1, string s2, int n2) {
vector<int> repeatCnt(n1 + 1, 0);
vector<int> nextIdx(n1 + 1, 0);
int j = 0, cnt = 0;
for (int k = 1; k <= n1; ++k) {
for (int i = 0; i < s1.size(); ++i) {
if (s1[i] == s2[j]) {
++j;
if (j == s2.size()) {
j = 0;
++cnt;
}
}
}
repeatCnt[k] = cnt;
nextIdx[k] = j;
for (int start = 0; start < k; ++start) {
if (nextIdx[start] == j) {
int interval = k - start;
int repeat = (n1 - start) / interval;
int patternCnt = (repeatCnt[k] - repeatCnt[start]) * repeat;
int remainCnt = repeatCnt[start + (n1 - start) % interval];
return (patternCnt + remainCnt) / n2;
}
}
}
return repeatCnt[n1] / n2;
}
};