• 567.字符串的排列


    给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列。

    换句话说,第一个字符串的排列之一是第二个字符串的子串。

    示例1:

    输入: s1 = "ab" s2 = "eidbaooo"
    输出: True
    解释: s2 包含 s1 的排列之一 ("ba").
    

    哈希表法:

    定义一个判断一个字符串是否属于另一个字符串全排列的函数,然后遍历s2调用该函数即可。
    而判断一个字符串是否属于另一个字符串全排列,需要想到哈希表。

        int hash[256]={0};
        bool isPermutation(const string& s1,const string& s2){
            memset(hash,0,256*sizeof(int));
            for(int i=0;i<s1.size();++i){
                hash[s1[i]]++;
            }
            for(int i=0;i<s2.size();++i){
                hash[s2[i]]--;
                if(hash[s2[i]]<0) return false;
            }
            return true;
    
        }
        bool checkInclusion(string s1, string s2) {
            int n1=s1.size(),n2=s2.size();
            if(n2<n1) return false;
            for(int i=0;i+n1<=n2;++i){
                if(isPermutation(s1,s2.substr(i,n1))) return true;
            }
            return false;
        }
    

    碰到的错误:memset第三个参数是数组大小不是数组元素个数!

    滑动窗口法:

    滑动窗口法避免了重复计算。

        bool checkInclusion(string s1, string s2) {
            
            // 排除异常的边界情况,也限定了模式串的长度
            if(s1.size() > s2.size()) return false;
            
            // 匹配采用的窗口大小为模式串大小
            int windowSize = s1.size();
            
            // 模式串的字典:可以看做一种频率分布
            vector<int> hashmap1(26, 0);
            // 动态更新的匹配窗口字典
            vector<int> hashmap2(26, 0);
            
            // 构建字典
            for(int i = 0; i < windowSize; i++) {
                hashmap1[s1[i] - 'a']++;
                hashmap2[s2[i] - 'a']++;
            }
            
            // 对于每一轮滑窗查询,如果两个字典相等(频率分布一致),则命中
            for(int i = windowSize; i < s2.size(); i++) {
                // 两个字典相等(频率分布一致),则命中
                if(hashmap1 == hashmap2) return true;
                
                // 否则,向右滑窗:滑窗对于 hash 表的操作变为对应频率的增减
                hashmap2[s2[i - windowSize] - 'a']--;
                hashmap2[s2[i] - 'a']++;
            }
            
            // 整个算法采用左闭右开区间,因此最后还有一个窗口没有判断
            return hashmap1 == hashmap2;
        }
    
  • 相关阅读:
    异常 集中异步处理
    客户端获取服务端自定义类数据 z
    客户端使用自定义代理类访问WCF服务 z
    学习“要件审判九步法”,正确处理五个关系 z
    “要件审判九步法”具体步骤
    要件审判九步法及其基本价值 z
    WCF Windows Service Using TopShelf and ServiceModelEx z
    [ACM_数据结构] Color the ball [线段树水题][数组开大]
    [ACM_数据结构] HDU 1166 敌兵布阵 线段树 或 树状数组
    [ACM_数据结构] 线段树模板
  • 原文地址:https://www.cnblogs.com/Frank-Hong/p/13345384.html
Copyright © 2020-2023  润新知