lintcode,最长无重复字符的子串

给定一个字符串,请找出其中无重复字符的最长子字符串。
样例
例如,在”abcabcbb”中,其无重复字符的最长子字符串是”abc”,其长度为 3。
对于,”bbbbb”,其无重复字符的最长子字符串为”b”,长度为1。

一刷没有ac
下面链接里面解释的很清楚,可以参考

http://blog.csdn.net/imabluefish/article/details/38662827
二刷没有ac,还是错在了map.get(ch) >= start这里
思路一:建立map存储字符和位置,一旦遇到重复的字符,就会跳回到第一次出现重复字符的下个字符开始重新计数。

public class Solution {
    /**
     * @param s: a string
     * @return: an integer 
     */
    public int lengthOfLongestSubstring(String s) {
        if (s == null || s.length() == 0) return 0;
        HashMap map = new HashMap();
        int res = 0;
        int len = 0;
        for(int i = 0; i < s.length(); i++){
            if(map.containsKey(s.charAt(i))){
                i = map.get(s.charAt(i));
                map.clear();
                len = 0;
                continue;
            }
            len++;
            map.put(s.charAt(i),i);
            res = Math.max(res,len);
        }
        return res;
    }
}

思路二:为了避免每次重建map,用一个start来记录开始的索引。用len来记录长度,在遍历字符串的过程中,每次判断字符是否包含在map中,如果包含并且包含的字符首次出现在start之后(因为start一定是越来越大的呀),则重置start为重复出现字符的下个字符,然后计算此时的len,并且判断是否最大。

public class Solution {
    /**
     * @param s: a string
     * @return: an integer 
     */
    public int lengthOfLongestSubstring(String s) {
        if (s == null || s.length() == 0) return 0;
        HashMap map = new HashMap();
        int res = 0;
        int len = 0;
        int start = 0;
        for(int i = 0; i < s.length(); i++){
            if(map.containsKey(s.charAt(i)) && map.get(s.charAt(i)) >= start){
                start = map.get(s.charAt(i)) + 1;
            }
            len = i - start + 1;
            map.put(s.charAt(i),i);
            res = Math.max(res,len);
        }
        return res;
    }
}

你可能感兴趣的:(lintcode)