开始刷力扣了,只想说一句:曾经年少不懂事! #(┬_┬)

题目

//给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
//
//        示例 1:
//
//        输入: "abcabcbb"
//        输出: 3
//        解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
//
//        来源:力扣(LeetCode)
//        链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters
//        著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

个人最初思路

//    思路,采用遍历方法,根据set的性质,来用add方法来确认重复元素,重复则进行下一个元素执行该方法。
    public static int lengthOfLongestSubstring(String s) {
//        获取最大长度
        int count=0;
        if (s.length()==1){
            return 1;
        }
        for (int i = 0; i <s.length(); i++) {
            char start=s.charAt(i);
            HashSet<Character> set=new HashSet();
            set.add(start);
            for (int j = i+1; j <s.length(); j++) {
                boolean flag=set.add(s.charAt(j));
                if (!flag){
                    break;
                }
            }
            if (set.size()>count){
                count=set.size();
            }
        }
        return count;
    }

滑动窗口思路

//    效率更高,采用滑动窗口思想(比自己的代码节省时间的地方主要是在set的创建,本人采用的是每次都重新创建,而导致效率低下)
    public static int lengthOfLongestSubstring1(String s) {
//        获取最大长度
        int count=0;
//        指针
        int p=0;
        if (s.length()==1){
            return 1;
        }
        HashSet<Character> set=new HashSet();
        for (int i = 0; i <s.length(); i++) {

            if (i>0){
                set.remove(s.charAt(i-1));
            }
             while (p<s.length() && !set.contains(s.charAt(p))){
                set.add(s.charAt(p));
                p++;
             }
            count = Math.max(count, set.size());
        }
        return count;
    }

效率比较:

效率比较