• leetcode——567. 字符串的排列


    Map<Character,Integer> ori = new HashMap<>();
        public boolean checkInclusion(String s1, String s2) {
            char[] c = s1.toCharArray();
            for(char c1:c){
                ori.put(c1,ori.getOrDefault(c1,0)+1);
            }
            int i = 0;
            int len1 = s1.length();
            int len2 = s2.length();
            while(i<=len2-len1){
                if(ori.containsKey(s2.charAt(i))){
                    int j = i;
                    Map<Character,Integer> cnt = new HashMap<>();
                    boolean flag = false;
                    for(;j<i+len1;j++){
                        if(!ori.containsKey(s2.charAt(j))){
                            flag = true;
                            i = j-1;
                            break;
                        }
                        cnt.put(s2.charAt(j),cnt.getOrDefault(s2.charAt(j),0)+1);
                    }
                    if(!flag) {
                        if(check(cnt)){
                            return true;
                        }
                    }
                }
                i++;
            }
            return false;
        }
    
        private boolean check(Map<Character,Integer> cnt) {
            for (char c : ori.keySet()) {
                if (!cnt.getOrDefault(c, 0).equals(ori.get(c))) {
                    return false;
                }
            }
            return true;
        }

     对是对了,但是好慢。

    public boolean checkInclusion(String s1, String s2) {
            Map<Character,Integer> need = new HashMap<>();
            Map<Character,Integer> window = new HashMap<>();
            char[] c = s1.toCharArray();
            for(char c1:c){
                need.put(c1,need.getOrDefault(c1,0)+1);
            }
            int left = 0,right = 0;
            int valid = 0;
            while(right<s2.length()){
                char c1 = s2.charAt(right);
                right++;
                if(need.containsKey(c1)){
                    window.put(c1,window.getOrDefault(c1,0)+1);
                    if(window.get(c1).equals(need.get(c1))){
                        valid++;
                    }
                }
                while (right-left>=s1.length()){
                    if(valid == need.size()){
                        return true;
                    }
                    char d = s2.charAt(left);
                    left++;
                    if(need.containsKey(d)){
                        if(window.get(d).equals(need.get(d))){
                            valid--;
                        }
                        window.put(d,window.get(d)-1);
                    }
                }
            }
            return false;
        }

    我的前方是万里征途,星辰大海!!
  • 相关阅读:
    WPF--常用布局介绍
    NUGET常用命令
    WPF 3D变换应用
    WPF MeshGeometry3D
    一组西门子S7 报文
    西门子与三菱PLC报文比较
    西门子S7报文解析
    C#与西门子PLC通讯
    Django之model admin自定义后台管理
    django ajax
  • 原文地址:https://www.cnblogs.com/taoyuxin/p/13594677.html
Copyright © 2020-2023  润新知