找循环做优化,0ms 2MB 跑双百
class Solution {
public:
int getMaxRepetitions(string s1, int n1, string s2, int n2) {
int len1 = s1.length(),len2 = s2.length();
int index1 = 0,index2 = 0;
if(len1 == 0||len2 == 0||len1 * n1 < len2 * n2) return 0;
map<int,int> map1,map2;
int ans=0; / 注意,此处存储的是 Ra 中 Sb 的个数,而非 Ra 中 Rb 的个数
while(index1/len1 < n1){ / 遍历整个 Ra
if(index1%len1 == len1-1){ /在 Sa 末尾
if(map1.find(index2%len2)!=map1.end()){ / 出现了循环,进行快进
int val = map1[index2%len2];
int cycleLen = index1/len1-val/len1; / 每个循环占多少个 Sa
int cycleNum = (n1-1-index1/len1)/cycleLen; / 还有多少个循环
int cycleS2Num = index2/len2 - map2[index2%len2]/len2; / 每个循环含有多少个 Sb
index1 += cycleNum * cycleLen * len1; / 将 Ra 快进到相应的位置
ans += cycleNum * cycleS2Num; / 把快进部分的答案数量加上
}else{ / 第一次,注意存储的是未取模的
map1[index2%len2] = index1;
map2[index2%len2] = index2;
}
}
if(s1[index1%len1] == s2[index2%len2]){
if(index2%len2 == len2-1){
ans += 1;
}
index2 += 1;
}
index1 += 1;
}
return ans / n2;
}
};
一看就能懂的计数法,有图有真相
动态规划解法