力扣-无重复字符的最长子串

方法一:暴力枚举

我的原始做法:使用临时数组依次存下子串,每次遍历是否重复

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int leng=s.length();
        char[] temp = new char[leng];//用c语言的思路做的,其实改成HashSet可以省一层循环
        int max=0;
        int k=0;
        if(leng==1)return 1;
        for(int i= 0;i<leng-1;i++){
            k=0;
            temp[k++]=s.charAt(i);
            for(int j=i+1;j<leng;j++){
                boolean flag = false;
                for(int z=0;z<k;z++){
                    if(s.charAt(j)==temp[z]){
                        flag = true;
                    }
                }
                if(flag==false){
                    temp[k++]=s.charAt(j);
                }else{
                    break;
                }
            }
            if(k>max){
                max=k;
            }
        }
        return max;
    }
}

 

方法二:滑动窗口

看过题解后按自己的思路改进的,主思路依然是分别从0,1,...开始数最长的子串,只不过通过哈希和滑动窗口的引入,省去了重复遍历中间那一截:

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int n=s.length();
        int max=0;
        int left = 0;
        HashSet<Character> ha = new HashSet<>();
        for(int i=0;i<n;){
            if(!ha.contains(s.charAt(i))){//不重复,放入哈希,右指针后移
                ha.add(s.charAt(i));
                i++;
                max = ha.size()>max?ha.size():max;//更新字串的最大长度
            }
            else{
                ha.remove(s.charAt(left));//重复,左指针+1,从下一个字符开始数子串
                left++;
            }
        }
        return max;
    }
}

 

posted @ 2023-08-21 20:24  无荔枝  阅读(60)  评论(0)    收藏  举报