最长不含重复字符的子字符串
请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
题解
-
滑动窗口(刚知道滑动窗口也是动态规划的一种)
- 算法思想
- 使用一个 map 记录字符串出现的位置
- 使用 i、j 两个指针(记录下 i-j,如果大于最大值,则更新最大值),j 每前进一步就检查字符串中 j 位置的元素之前(记为 m)是否出现过,是否在 i-j 之间
- 如果在 i-j 之间,则将 i 的位置前进至m。
- 如果不在,则继续前进 j
- 直到结束
- 复杂度分析
- 时间复杂度 O(n):j 指针前进 n 次
- 空间复杂度 O(1):字符的 ASCII 码范围为 00 ~ 127127 ,哈希表 dicdic 最多使用 O(128) = O(1)O(128)=O(1) 大小的额外空间。
class Solution { public int lengthOfLongestSubstring(String s) { HashMap<Character,Integer> map = new HashMap<>(); int i = 0,res = 0,longest = 0; for(int j = 0;j < s.length();j++){ int lastAppear = map.getOrDefault(s.charAt(j),-1); if(lastAppear != -1)i = lastAppear + 1; map.put(s.charAt(j),j); longest = longest < j - lastAppear ? longest + 1 : j - lastAppear; res = Math.max(res,longest); } return res; } }
- 算法思想
-
暴力解法
- 算法思想
- 列举出所有的子串,然后在比较字符串的大小
- 复杂度分析
- 时间复杂度 O(n^3):列举所有的字符串需要 n^2,比较所有子串的长度需要 n。
- 空间复杂度 O(n^2)
- 算法太渣,不能使用
- 算法思想
总结
- 遇到子串问题记得想想滑动窗口,想想双指针