文章目录
- 题目
- 思路
- 代码
题目
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;}
};