1. 程式人生 > >466.統計重複個數

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