[抄题]:
给定一个字符串,请找出其中无重复字符的最长子字符串。
例如,在"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; } }