算法-剑指offer 48. 最长不含重复字符的字符子串

题目:最长不含重复字符的字符子串

1. 示例1

输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

2. 示例2

输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

3. 解题方法:双指针

采用两个指针记录最大不重复子串的左右区间,使用HasHSet维护范围内所含有的字符集合。在快指针向后扫描时,如果集合中不存在此元素则直接将字符加入集合,否则慢指针后扫描至与快指针相同的字符之后,同时将所有扫描路径上的字符从集合中删除。具体代码如下:

class Solution {
    public int lengthOfLongestSubstring(String s) {
        if(s == null || s.length() == 0){
            return 0;
        }

        int start = 0;
        int end = 0;
        HashSet<Character> set = new HashSet<>();
        int max = Integer.MIN_VALUE;
        while(end < s.length()){
            char ch = s.charAt(end);
            if(set.contains(ch)){
                int len = end - start;
                if(len > max){
                    max = len;
                }
                while(start <= end && s.charAt(start) != ch){
                    set.remove(s.charAt(start));
                    ++start;
                }

                start++;
            }else{
                set.add(ch);
            }
            ++end;
        }
        if(end - start > max){
            max = end - start;
        }
        return max;
    }
}
~~~Java
全部评论

相关推荐

海螺很能干:每次看到这种简历都没工作我就觉得离谱
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务