最长无重复子串(Java)Longest Substring Without Repeating Characters

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要能装下所有不同的字符

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。