美文网首页
最长无重复子串(Java)Longest Substring W

最长无重复子串(Java)Longest Substring W

作者: IT志男 | 来源:发表于2018-05-21 14:58 被阅读21次

    Longest Substring Without Repeating Characters

    LeetCode算法第3题
    思路:
    1、字符串或数组的子串问题,可以用两个索引区间来表示。长度即为:j - i + 1
    2、题目要求无重复,时间复杂度低的查找可以想到哈希查找,通过使用HashSet来检查字符是否重复的时间复杂度为O(1)

    流程:
    ①创建一个HashSet来保存当前字符串的字符
    ij 两个索引表示当前子串,从0、0开始, ij 表示的都是第一个字符
    ③把索引 j 逐个向右扫描,并检查索引 j 位置的字符是否在set中
    ④如果索引 j 位置的字符不在set中,则将索引 j 位置的字符加入set
    ⑤查看并比较当前子串长度
    ⑥继续将 j 索引向右
    ⑦如果索引 j 位置的字符在set中,则将索引 i 位置的字符移出set
    ⑧并将索引 i 向右移动(如果索引 j 位置的字符仍然在set中,则继续执行⑦⑧)

    public class Solution {
        public int lengthOfLongestSubstring(String s) {
            int n = s.length();
            Set<Character> set = new HashSet<>();//<1>
            int ans = 0, i = 0, j = 0;//<2>
            while (i < n && j < n) {
                if (!set.contains(s.charAt(j))) {//<3>
                    set.add(s.charAt(j));//<4>
                    ans = Math.max(ans, j - i + 1);//<5>
                    j++;//<6>
                } else {
                    set.remove(s.charAt(i));//<7>
                    i++;//<8>
                }
            }
            return ans;
        }
    }
    

    时间复杂度,最多进行两个循环,把i循环到n,把j循环到n,所以为O(2n),即为O(n)
    空间复杂度取决于要查找的字符,set要能装下所有不同的字符

    相关文章

      网友评论

          本文标题:最长无重复子串(Java)Longest Substring W

          本文链接:https://www.haomeiwen.com/subject/zdwfjftx.html