1 map 固定窗口实现 不够速度 词频统计

class Solution {
public:
vector<int> findAnagrams(string s, string p) {
map<char,int> p_map;
map<char,int> s_map;
vector<int> result_;
for(int i=0;i<p.size();i++){
if(p_map.contains(p[i])){
p_map[p[i]]++;
}
else{
p_map[p[i]]=1;
}
}
// p 6 s 10 i 4(0) i=5 L=i-0+1=6
for(int i=0;i<s.size();i++){
if(s_map.contains(s[i])){
s_map[s[i]]++;
}
else{
s_map[s[i]]=1;
}
int left=i-p.size()+1;
if(left<0){
continue;
}
if(s_map==p_map){
result_.push_back(left);
}
s_map[s[left]]--;
if( s_map[s[left]]==0){
s_map.erase(s[left]);
}
}
return result_;
}
};
官方 固定窗口 数组 词频

class Solution {
public:
// map 固定滑动窗
vector<int> Test1_map_fix(string s, string p) {
map<char,int> p_map;
map<char,int> s_map;
vector<int> result_;
for(int i=0;i<p.size();i++){
if(p_map.contains(p[i])){
p_map[p[i]]++;
}
else{
p_map[p[i]]=1;
}
}
// p 6 s 10 i 4(0) i=5 L=i-0+1=6
for(int i=0;i<s.size();i++){
if(s_map.contains(s[i])){
s_map[s[i]]++;
}
else{
s_map[s[i]]=1;
}
int left=i-p.size()+1;
if(left<0){
continue;
}
if(s_map==p_map){
result_.push_back(left);
}
s_map[s[left]]--;
if( s_map[s[left]]==0){
s_map.erase(s[left]);
}
}
return result_;
}
vector<int> findAnagrams(string s, string p) {
array<int,26> p_map;
array<int,26> s_map;
vector<int> result_;
for(int i=0;i<p.size();i++){
p_map[p[i]-'a']++;
}
// p 6 s 10 i 4(0) i=5 L=i-0+1=6
for(int i=0;i<s.size();i++){
s_map[s[i]-'a']++;
int left=i+1-p.size();
if(left<0){
continue;
}
if(s_map==p_map){
result_.push_back(left);
}
s_map[s[left]-'a']--;
}
return result_;
}
};
官方 非定长滑动窗

class Solution {
public:
// map 固定滑动窗
vector<int> Test1_map_fix(string s, string p) {
map<char,int> p_map;
map<char,int> s_map;
vector<int> result_;
for(int i=0;i<p.size();i++){
if(p_map.contains(p[i])){
p_map[p[i]]++;
}
else{
p_map[p[i]]=1;
}
}
// p 6 s 10 i 4(0) i=5 L=i-0+1=6
for(int i=0;i<s.size();i++){
if(s_map.contains(s[i])){
s_map[s[i]]++;
}
else{
s_map[s[i]]=1;
}
int left=i-p.size()+1;
if(left<0){
continue;
}
if(s_map==p_map){
result_.push_back(left);
}
s_map[s[left]]--;
if( s_map[s[left]]==0){
s_map.erase(s[left]);
}
}
return result_;
}
vector<int> Test2_array_fix(string s, string p) {
array<int,26> p_map;
array<int,26> s_map;
vector<int> result_;
for(int i=0;i<p.size();i++){
p_map[p[i]-'a']++;
}
// p 6 s 10 i 4(0) i=5 L=i-0+1=6
for(int i=0;i<s.size();i++){
s_map[s[i]-'a']++;
int left=i+1-p.size();
if(left<0){
continue;
}
if(s_map==p_map){
result_.push_back(left);
}
s_map[s[left]-'a']--;
}
return result_;
}
vector<int> findAnagrams(string s, string p) {
array<int,26> p_map;
array<int,26> s_map;
vector<int> result_;
for(int i=0;i<p.size();i++){
p_map[p[i]-'a']++;
}
// p 6 s 10 i 4(0) i=5 L=i-0+1=6
int left=0;
for(int right =0;right <s.size();right++){
int c_index=s[right]-'a';
p_map[c_index]--;
while(p_map[c_index]<0){
p_map[s[left]-'a']++;
left++;
}
if(right-left+1 == p.length()){
result_.push_back(left);
}
}
return result_;
}
};

自己改进后的

vector<int> findAnagrams(string s, string p) {
array<int,26> p_map;
array<int,26> s_map;
vector<int> result_;
for(int i=0;i<p.size();i++){
p_map[p[i]-'a']++;
}
// p 6 s 10 i 4(0) i=5 L=i-0+1=6
int left=0;
for(int right =0;right <s.size();right++){
s_map[s[right]-'a']++;
while(s_map[s[right]-'a']>p_map[s[right]-'a']){
s_map[s[left]-'a']--;//0 开始
left++;
}
if(s_map == p_map){
result_.push_back(left);
}
}
return result_;
}
改进判定条件 正向判断
为什么长度相等就可以

class Solution {
public:
// map 固定滑动窗
vector<int> Test1_map_fix(string s, string p) {
map<char,int> p_map;
map<char,int> s_map;
vector<int> result_;
for(int i=0;i<p.size();i++){
if(p_map.contains(p[i])){
p_map[p[i]]++;
}
else{
p_map[p[i]]=1;
}
}
// p 6 s 10 i 4(0) i=5 L=i-0+1=6
for(int i=0;i<s.size();i++){
if(s_map.contains(s[i])){
s_map[s[i]]++;
}
else{
s_map[s[i]]=1;
}
int left=i-p.size()+1;
if(left<0){
continue;
}
if(s_map==p_map){
result_.push_back(left);
}
s_map[s[left]]--;
if( s_map[s[left]]==0){
s_map.erase(s[left]);
}
}
return result_;
}
vector<int> Test2_array_fix(string s, string p) {
array<int,26> p_map;
array<int,26> s_map;
vector<int> result_;
for(int i=0;i<p.size();i++){
p_map[p[i]-'a']++;
}
// p 6 s 10 i 4(0) i=5 L=i-0+1=6
for(int i=0;i<s.size();i++){
s_map[s[i]-'a']++;
int left=i+1-p.size();
if(left<0){
continue;
}
if(s_map==p_map){
result_.push_back(left);
}
s_map[s[left]-'a']--;
}
return result_;
}
//
vector<int> TEST_guangfang_unfix_(string s, string p) {
array<int,26> p_map;
array<int,26> s_map;
vector<int> result_;
for(int i=0;i<p.size();i++){
p_map[p[i]-'a']++;
}
// p 6 s 10 i 4(0) i=5 L=i-0+1=6
int left=0;
for(int right =0;right <s.size();right++){
int c_index=s[right]-'a';
p_map[c_index]--;
while(p_map[c_index]<0){
p_map[s[left]-'a']++;
left++;
}
if(right-left+1 == p.length()){
result_.push_back(left);
}
}
return result_;
}
vector<int> findAnagrams(string s, string p) {
array<int,26> p_map;
array<int,26> s_map;
vector<int> result_;
for(int i=0;i<p.size();i++){
p_map[p[i]-'a']++;
}
// p 6 s 10 i 4(0) i=5 L=i-0+1=6
int left=0;
for(int right =0;right <s.size();right++){
s_map[s[right]-'a']++;
// 如果字母不存在 p_map[s[right]-'a']=0 必然触发大于,然后while跳过
// 窗口内该字母多了,移动左指针不停地扔,直到遇到左侧的第一个该字母扔掉,达到新平衡,那么左侧的多余的都被清除了
while(s_map[s[right]-'a']>p_map[s[right]-'a']){
s_map[s[left]-'a']--;//0 开始
left++;
}
//if(s_map == p_map){
// 当我没有触达 whiler扔数据时候,证明前面都是满足的,起码每个字母<=目标的频次
// 在长度一样长的前提下,前面没有一个字母超过的,且不存在的也被跳过了,那么只能是相同了
// 不存在的理解,不是不存在,而是字幕的频次为0,存在但是是0.这样就统一对待了。
if(left == right-p.size()+1){ // 这就是为什么可以用长度相等来判定是否满足,前方有while卡死了
result_.push_back(left);
}
}
return result_;
}
};
和官网比为什么慢
因为你是正向0-N填充,上坡路,要慢慢追上去
他是从N-0递减判断,走下坡路,他更快。
浙公网安备 33010602011771号