无重复字符的最长子串代码实现

上代码:

方法一(HashMap集合实现):

    public static int get(String s) {
//      判断字符串是否为空
        if(s.length() == 0){
            return 0;
        }
//      定义left指针
        int left= 0;
//      定义最大容量
        int max = 0;
//      定义一个map,作为一个滑动窗口
        HashMap<Character, Integer> map = new HashMap<>();
//      遍历字符串
        for (int i = 0; i < s.length(); i++) {
//          是否有重复的元素,如果有重复元素,变化left指针,没有继续执行
//          1.只要重复则必须要与原来的left比大小,判断更新left指针
//          2.map.get(s.charAt(i)) 获得的是重复元素在map中left的指针 +1是因为i是从0开始的
//          3.left的更新与个数有关系
            if(map.containsKey(s.charAt(i))){
                left = Math.max(left,map.get(s.charAt(i))+1);
            }
//          重复的字符key,直接会将其覆盖,但下标(Integer)会进行更新
            map.put(s.charAt(i),i);
//          更新max的最大值,比大小看是否要进行覆盖
            max = Math.max(max,i - left + 1);
        }
//      返回个数
        return max;
    }

 方法二(好理解的Set集合实现):

    public static int getNumSet(String s){
        int j = 0;
        int maxLength = 0;
//      创建一个set集合
        Set<Character> set = new HashSet<>();
        for (int i = 0; i < s.length(); i++) {
//          判断是否包含这个元素,不包含添加,并更新maxLength,
//          包含将此元素以及此元素之前的元素全部在set结合中删除
            if (!set.contains(s.charAt(i))){
//              添加
                set.add(s.charAt(i));
                maxLength = Math.max(maxLength,set.size());
            }else{
                while (set.contains(s.charAt(i))){
                    set.remove(s.charAt(j));
                    j++;
                }
//              添加
                set.add(s.charAt(i));
            }
        }
        return maxLength;
    }

HashMap版(不建议用,运行耗内存,value值没用到):

    public static int getNumMap(String s){
        int left = 0;
        int maxLength = 0;
        HashMap<Character, Integer> map = new HashMap<>();
        for (int i = 0; i < s.length(); i++) {
            if(!map.containsKey(s.charAt(i))){
                map.put(s.charAt(i),i);
                maxLength = Math.max(maxLength,map.size());
            }else {
                while(map.containsKey(s.charAt(i))){
                    map.remove(s.charAt(left));
                    left++;
                }
                map.put(s.charAt(i),i);
            }
        }
        return maxLength;
    }

 

posted @ 2022-07-12 00:39  努力学习の小白  阅读(29)  评论(0编辑  收藏  举报
Live2D