leetcode 3008. 找出数组中的美丽下标 II
题目如下
数据范围
首先使用kmp算法统计两个串的出现下标,随后使用双指针匹配就行。这道题纯纯kmp模板题。
通过代码
class Solution {
public:
vector<int> beautifulIndices(string s, string a, string b, int k) {
int al = a.size();
int bl = b.size();
int n = s.size();
vector<int> af;
vector<int> bf;
vector<int> ans;
vector<int> an(al, 0), bn(bl, 0);
for (int i = 1, j = 0; i < al; i++) {
while (j > 0 && a[i] != a[j])
j = an[j - 1];
if (a[i] == a[j])
j++;
an[i] = j;
}
for (int i = 1, j = 0; i < bl; i++) {
while (j > 0 && b[i] != b[j])
j = bn[j - 1];
if (b[i] == b[j])
j++;
bn[i] = j;
}
int j = 0;
int i = 0;
while (i < n) {
if (s[i] == a[j]) {
i++;
j++;
} else {
if (j > 0) {
j = an[j - 1];
} else {
i++;
}
}
if (al == j) {
// cout << i<< endl;
af.push_back(i - al);
j = an[j - 1];
}
}
i = j = 0;
while (i < n) {
if (s[i] == b[j]) {
i++;
j++;
} else {
if (j > 0) {
j = bn[j - 1];
} else {
i++;
}
}
if (bl == j) {
bf.push_back(i - bl);
j = bn[j - 1];
}
}
int l = 0, r = 0;
while (l < af.size() && r < bf.size()) {
if (abs(af[l] - bf[r]) <= k) {
ans.push_back(af[l]);
l++;
} else if (af[l] < bf[r]) {
l++;
} else {
r++;
}
}
return ans;
}
};