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<Character, Integer> map = new HashMap<Character, Integer>();
        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<Character, Integer> map = new HashMap<Character, Integer>();
        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;
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值