zoukankan      html  css  js  c++  java
  • c++滑动窗口进阶版求找到字符串中所有字母异位词

    /**
     * 问题:找到字符串中所有字母异位词
     * 要求:给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引。
     * 注意事项:字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100。
     * 方法1:利用滑动数组去做
     * class Solution {
    private:
        vector<int>list;
        int a[26]={0};
        int b[26]={0};
    public:
        vector<int> findAnagrams(string s, string p) {
            if(s.length()==0||p.length()==0||s.length()<p.length())return list;
            for(int i=0;i<p.length();++i){
                a[s[i]-'a']++;
                b[p[i]-'a']++;
            }
            int left=0;
            int right=p.length();
            while(right<s.length())
            {
                if(isValid(a,b))list.push_back(left);
                a[s[left++]-'a']--;
                a[s[right++]-'a']++;
            }
            if(isValid(a,b))list.push_back(left);
            return list;
        }
    public:
        bool isValid(int a[],int b[])
        {
            for(int i=0;i<26;++i)
                if(a[i]!=b[i])return false;
            return true;
        }
    };
    
     * 方法2:利用图的思想去做,把p的元素都放在map中,再依次遍历s一旦有就立即往后检验
     * 方法3:KMP算法
     * 方法4:暴力+hashMap(最后一个案例会超时)
     * class Solution {
        private List<Integer>list=new ArrayList<Integer>();
        private Map<Character,Integer>mm=new HashMap<Character,Integer>();
        public List<Integer> findAnagrams(String s, String p) {
            if(s.length()<p.length())return list;
            for(int i=0;i<p.length();++i)
                mm.put(p.charAt(i), mm.get(p.charAt(i))==null?1:mm.get(p.charAt(i))+1);       
            int m=s.length();
            int n=p.length();
            for(int i=0;i<=m-n;++i)
                if(mm.containsKey(s.charAt(i))&&isValid(s,p,i,i+n-1))list.add(i);
            return list;
        }
        
        public boolean isValid(String s, String p,int left,int right)
        {
            Map<Character,Integer>map=new HashMap<Character,Integer>();
            for(int i=left;i<=right;++i)
                map.put(s.charAt(i), map.get(s.charAt(i))==null?1:map.get(s.charAt(i))+1);   
            if(mm.size()!=map.size())return false;
            for(int i=0;i<p.length();++i) {
                if(map.containsKey(p.charAt(i))&&map.get(p.charAt(i))!=0)map.put(p.charAt(i), map.get(p.charAt(i))-1);
                else return false;
            }            
            return true;
        }
    }
     */
  • 相关阅读:
    【链接】idea没有svn
    移动端适配解决方案
    项目中多个文件引入同一份公共样式less文件导致编译打包后有多份样式
    2020最新编辑器集成eslint、prettier、stylelint,git提交预检查代码配置
    eslint+prettier学习
    artTempate模版继承父模版之后再引入子模版不生效?
    iOS底层原理开篇
    iOS应用千万级架构:安全与加密
    使用RabbitMQ实现延迟任务
    JAVA三元运算符空指针引用的坑
  • 原文地址:https://www.cnblogs.com/z2529827226/p/11764184.html
Copyright © 2011-2022 走看看