leetcode 3. Longest Substring Without Repeating Characters

题目
方法一:
用map存储每一个字符最近出现的位置,并且实时更新。用left和right分别记录。right记录的是第一次出现重复字符串的位置。left记录的是重复字符第一次出现的位置和当前left比较出较大的那一个。

class Solution {
    public int lengthOfLongestSubstring(String s) {
        if(s.length()==0) return 0;
        HashMap<Character,Integer> map = new HashMap<>();
        char[] ch = s.toCharArray();
        int left=0,right=0,res=0,max=Integer.MIN_VALUE;
        for(int i=0;i<ch.length;i++){
            char a = s.charAt(i);
            if(!map.containsKey(a)){
                map.put(a,i);
                right = i;
                max = Math.max(max,right-left+1);
            }else{
                left = Math.max(left,map.get(a)+1);
                map.put(a,i);
                right = i;
                max = Math.max(max,right-left+1);
            }
        }
        return max;
    }
}

方法二:
维护两个指针left和right。维护一个在left和right之间的一个set。如果当前set包含right对应的字符,那么一直删除left对应的字符,并且left++,直到不包含这个字符,再把这个字符加进去。实时的比较set的大小。

class Solution {
    public int lengthOfLongestSubstring(String s) {
        if(s.length()==0) return 0;
        Set<Character> set = new HashSet<>();
        int left=0,right=0,max=Integer.MIN_VALUE;
        while(left<s.length() && right<s.length()){
            char tmp = s.charAt(right);
            if(set.contains(tmp)){
                set.remove(s.charAt(left));
                left++;
            }else{
                set.add(tmp);
                right++;
                max = Math.max(max,set.size());
            }
        }
        return max;
    }
}
发布了191 篇原创文章 · 获赞 1 · 访问量 2353
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 深蓝海洋 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览