LeetCode之3. 无重复字符的最长子串

题目:给定一个字符串,找出不含有重复字符的最长子串的长度。

示例:

给定 “abcabcbb” ,没有重复字符的最长子串是 “abc” ,那么长度就是3。
给定 “bbbbb” ,最长的子串就是 “b” ,长度是1。
给定 “pwwkew” ,最长子串是 “wke” ,长度是3。请注意答案必须是一个子串,”pwke” 是 子序列 而不是子串。

思路:用一个数组记录字符串的字符数组,一个LInkList集合记录子串,如果子串集合不包含当前字符,则当前字符加入集合,同时记录子串长,判断与最长子串的长度大小。如果已经包含当前字符,则清除子串元素直到重复元素的前一个元素为止

public int lengthOfLongestSubstring(String s)
    {

        char[] arr=s.toCharArray();
        //存储子串的值
        LinkedList temp=new LinkedList();

        //记录最长的子串的长度
        int num=0;
        //记录当前子串长度
        int currentNum=0;

        //如果子串不包含当前字符,则加入子串,同时记录子串长度,同时判断当前字符长度是否大于最长字符长度。
        //如果子串包含当前字符,则依旧把当前字符加入子串,然后删除元素直到重复元素的第一个元素
        for(int i=0;i<arr.length;i++)
        {
            if(!temp.contains(arr[i])){
                temp.add(arr[i]);
                currentNum=temp.size();
                if(currentNum>num)
                {
                    num=currentNum;
                }
            }else{
                temp.add(arr[i]);

                //找到重复的元素在子串中前面的那个元素的位置,例如:"jpwp"则找的位置是1
                int len=temp.indexOf(arr[i]);

                //LinkList的remove从位置为0的地方开始移除,这里的意思是直到把重复元素的位置靠前的那个删除,例如:"jpwp"则删除元素直到"wp"
                //这里注意LinkList在remove元素时候的方式,即从0位置开始
                for(int j=0;j<len;j++)
                {
                    temp.remove();
                }
                temp.remove();
            }

        }

        return num;
    }
点赞