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

来源:互联网 发布:python 字典值为空 编辑:程序博客网 时间:2024/05/18 17:56

给定一个字符串,请找出其中无重复字符的最长子字符串。
样例
例如,在”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;    }}
0 0
原创粉丝点击