最长无重复字符的子串 · Longest Substring Without Repeating Characters

[抄题]:

给定一个字符串,请找出其中无重复字符的最长子字符串。

例如,在"abcabcbb"中,其无重复字符的最长子字符串是"abc",其长度为 3

对于,"bbbbb",其无重复字符的最长子字符串为"b",长度为1

 [暴力解法]:

时间分析:

空间分析:

[思维问题]:

hashset, hashmap想着是简单,但是实现起来都要先存再取,其实比较麻烦

涉及到字母甚至256个字符的出现次数时,直接用数组int[256]反而比较方便,随意地可以设成0 1,修改极其方便。

有数组的话,和两根指针练习比较紧密

[一句话思路]:

同向不定窗口

[输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):

[画图]:

[一刷]:

[二刷]:

[三刷]:

[四刷]:

[五刷]:

  [五分钟肉眼debug的结果]:

i复位时写成j了,要小心

[总结]:

boy全部遍历到(再次初始化i)且只走一次,girl全部遍历到且只走一次(j不复位)

[复杂度]:Time complexity: O(2n) Space complexity: O(n)

[英文数据结构或算法,为什么不用别的数据结构或算法]:

charat(i)是圆括号不是方括号

[关键模板化代码]:

for (i = 0; i < s.length(); i++) {
            while (j < s.length() && map[s.charAt(j)] == 0) {//bracket
            j++
            }
            map[s.charAt(i)] = 0;
        }    
同向不定窗口

[其他解法]:

[Follow Up]:

[LC给出的题目变变变]:

 [代码风格] :

public class Solution {
    /**
     * @param s: a string
     * @return: an integer
     */
    public int lengthOfLongestSubstring(String s) {
        //corner case
        if (s == null) {
            return 0;
        }
        //i,j go in the same dir
        int i = 0, j = 0;
        int ans = 0;
        int[] map = new int[256];
        
        for (i = 0; i < s.length(); i++) {
            while (j < s.length() && map[s.charAt(j)] == 0) {//bracket
                map[s.charAt(j)] = 1;
                ans = Math.max(ans, j - i + 1);
                j++;
            }
            map[s.charAt(i)] = 0;
        }
        
        return ans;
    }
}
View Code

 

posted @ 2018-03-04 15:26  苗妙苗  阅读(200)  评论(0编辑  收藏  举报