文章目录
- 题目
 - 思路
 - 代码
 
题目
466. 统计重复个数
 
思路
题目要求找出一个最大整数 m,使得经过 n2 个字符串 s2 组成的字符串能够被经过 n1 个字符串 s1 组成的字符串完全包含的次数。使用动态规划来记录每个位置匹配的情况,并通过循环节的分析来计算最终的匹配次数。
代码
class Solution {
public:
    int getMaxRepetitions(string s1, int n1, string s2, int n2) {
        int len1 = s1.length();
        int len2 = s2.length();
        vector<vector<int>> next(len1 + 1, vector<int>(26, 0));
        vector<vector<int>> dp(len1 + 1, vector<int>(2, 0));
        for (int i = 0; i < 26; i++) {
            next[len1][i] = INT_MAX;
        }
        for (int i = len1 - 1; i >= 0; i--) {
            int idx = s1[i] - 'a';
            for (int j = 0; j < 26; j++) {
                next[i][j] = next[i + 1][j];
                if (j == idx) {
                    next[i][j] = i + 1;
                }
            }
        }
        for (int i = 0; i < len1 + 1; i++) {
            int count = 0;
            int offset = i;
            int j = 0;
            while (j < len2) {
                int idx = s2[j] - 'a';
                int pos = next[offset][idx];
                if (offset == 0 && pos == INT_MAX) {
                    return 0;
                }
                if (pos == INT_MAX) {
                    offset = 0;
                    count++;
                } else {
                    offset = pos;
                    j++;
                }
            }
            dp[i][0] = count;
            dp[i][1] = offset;
        }
        int p = 1;
        int total = 0;
        int offset = 0;
        while (p <= n1) {
            int count = dp[offset][0];
            int idx = dp[offset][1];
            if (p + count > n1) {
                break;
            }
            p = p + count;
            total++;
            offset = idx;
        }
        return total / n2;
    }
};
                

















