在C ++中查找字符串中的所有字母
假设我们有一个字符串s和一个非空字符串p,我们必须在s中找到p的字谜的所有起始索引。这些字符串仅包含小写字母,并且字符串s和p的长度都不会大于20和100。因此,例如,如果s:“cbaebabacd”p:“abc”,则输出将为[0,6],在索引0处为“cba”,另一个为“bac”,它们是“abc”的字谜。
为了解决这个问题,我们将遵循以下步骤-
定义一个映射m,n:=s的大小,设置左:=0,右:=0,计数器:=p的大小
定义一个数组
将p中的字符频率存储到映射m中
正确:=0至n–1
而左<右,
如果m没有s[left],则设置left:=right+1
如果m中不存在s[left],则将counter增加1,并将m[s[left]]增加1
向左增加1
如果m具有s[right]且m[s[right]]非零,则将right减1,然后从循环中得出
如果m具有s[right]且m[s[right]]非零,则将m[s[right]]减1,将counter减1,如果counter=0,则将left插入ans
除此以外
返回ans
例子(C++)
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<auto> v){
cout << "[";
for(int i = 0; i<v.size(); i++){
cout << v[i] << ", ";
}
cout << "]"<<endl;
}
class Solution {
public:
vector<int> findAnagrams(string s, string p) {
map <char, int> m;
int n = s.size();
int left = 0, right = 0;
int counter = p.size();
vector <int> ans;
for(int i = 0; i < p.size(); i++) m[p[i]]++;
for(int right = 0; right < n; right++){
if(m.find(s[right]) != m.end() && m[s[right]]){
m[s[right]]--;
counter--;
if(counter == 0)ans.push_back(left);
} else {
while(left<right){
if(m.find(s[left]) != m.end()) {
counter++;
m[s[left]]++;
}
left++;
if(m.find(s[right]) != m.end() && m[s[right]]){
right--;
break;
}
}
if(m.find(s[left])==m.end())left = right + 1;
}
}
return ans;
}
};
main(){
Solution ob;
print_vector(ob.findAnagrams("cbaebabacd", "abc")) ;
}输入项
"cbaebabacd" "abc"
输出结果
[0, 6, ]