• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
MKT-porter
博客园    首页    新随笔    联系   管理    订阅  订阅
reLeetCode 热题 100- 438. 找到字符串中所有字母异位词

 

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

image

 

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_;
        
    }


    
};

  

官方 固定窗口 数组 词频

image

 

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_;
        
    }
    
};

  

官方 非定长滑动窗

image

 

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_;
        
    }
};

  

image

 

自己改进后的

image

 

 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_;
        
    }

  

改进判定条件 正向判断

为什么长度相等就可以

image

 

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递减判断,走下坡路,他更快。

 

posted on 2025-10-06 04:06  MKT-porter  阅读(13)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3