假设我们有两个字符串S和T,我们必须找到T中S的字谜的所有起始索引。这些字符串仅包含小写字母,并且字符串S和T的长度都不会大于20和100。
因此,如果输入类似于S =“ cab” T =“ bcabxabc”,则输出将为[0,1,5,],作为子字符串“ bca”,“ cab”和“ 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
让我们看下面的实现以更好地理解:
#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("bcabxabc", "cab")) ; }
"bcabxabc", "cab"
输出结果
[0, 1, 5, ]