力扣第三题,无重复字符的最长子串

博客探讨了力扣第三题的两种解决方案,分别是自创的双指针法和滑动窗口法。双指针法通过遍历字符串,遇到重复字符时删除靠前的重复元素及其之前的内容;滑动窗口法则利用HashMap记录字符位置,动态调整窗口边界。这两种方法都旨在找到无重复字符的最长子串及其长度。

力扣第三题,无重复字符的最长子串

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

在这里插入图片描述

这里我给两种解法,一种是我自己写的,还有一种是题解里的

/**
     *思路:一位一位添加入list,如有重复的,则将靠前的重复元素同前面的内容一并删除
     * @param s
     * @return
     */
    public int lengthOfLongestSubstring(String s) {
        List<Character> list = new ArrayList<>();//存储当前结果
        //处理特殊情况
        if (s.length()==0){
            return 0;
        }else if (s.equals(" ")){
            return 1;
        }else {
            int temp = 0;//记录当前最长子串
            for (int i = 0; i < s.length(); i++) {
                if (!(list.contains(s.charAt(i)))){
                    //如list集合中没有当前元素,则添加
                    list.add(s.charAt(i));
                }else {//如果有重复元素
                    //先将最大长度存入temp
                    if (list.size()>temp){
                        temp=list.size();
                    }
                    //将靠前的那个重复元素和前面的内容全部删除
                    int j = list.lastIndexOf(s.charAt(i));
                    for (int i1 = 0; i1 <= j; i1++) {
                        list.remove(0);
                    }
                    //添加当前元素
                    list.add(s.charAt(i));
                }
            }
            return list.size()>temp?list.size():temp;
        }


    }

    /**
     * 搬运于力扣题解,滑动窗口法
     * 使用两个数代表最长子串的左界限和右界限。遇到相同元素则移动左界,右界即为循环指针
     * @param s
     * @return
     */
    public int le(String s) {
        if (s.length()==0) return 0;
        HashMap<Character, Integer> map = new HashMap<Character, Integer>();
        int max = 0;//长度
        int left = 0;//左界
        for(int i = 0; i < s.length(); i ++){
            if(map.containsKey(s.charAt(i))){//如果遇到相同元素
                left = Math.max(left,map.get(s.charAt(i)) + 1);//将左界移到靠前那个重复元素的后一位
            }
            map.put(s.charAt(i),i);//将当前元素存入map
            max = Math.max(max,i-left+1);//记录当前长度
        }
        return max;

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值