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

 昨天2.28看了题解,今天试着写了一下。

class Solution {
    public int lengthOfLongestSubstring(String s) {
        //思路是再每个以i开头的求出无重复子串的长度
        Set<Character> set = new HashSet<Character>();
        int res=0;
        int len=s.length();
        int flag=0;
        for(int i=0;i<len;i++) {
            for(int j=flag;j<len;j++) {//最初设置j从0开始 改成了j 发现其实应该从上次的位置开始的
                if(!set.add(s.charAt(j))) {
                    res=Math.max(res, set.size());
                    set.remove(s.charAt(i));
                    flag=j;
                    break;
                }
            }
        }
        res=Math.max(res,set.size());//当长度为1时会输出0 消去这种情况
        return res;
    }
}

 

 

自己尝试看了一个滑动窗口【简219】题解去写 但是思路也不太一样

对于这种情况 只能识别从头开始的最长字串 字符串不会移动 一旦从头添加出现添加过的元素就bug 所以是不对的

错误代码:[对219照猫画虎]

class Solution {
    public int lengthOfLongestSubstring(String s) {
        Set<Character> set = new HashSet<Character>();
        int res=0;
        int length=s.length();
        for(int flag=length-1;flag>0;flag--) {
            for(int i=0;i<length;i++) {
                if(i>flag) {
                    set.remove(s.charAt(i-flag-1));
                }
                if(!set.add(s.charAt(i))) {
                    set.clear(); //最初报错 由于没有清除 到下一次flag的时候从头添加总是已经包含此元素
                    break;
                }
                if(set.size()==flag+1) {
                    res = flag+1;
                    return res;
                }
            }
        }
        return res;
    }
}

 

posted @ 2023-03-01 09:58  Ssshiny  阅读(17)  评论(0)    收藏  举报