3.无重复字符的最长子串
题目:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
提示:
0 <= s.length <= 5 * 104
s 由英文字母、数字、符号和空格组成
代码:
方法一:暴力解法
时间复杂度:O(n2)
空间复杂度:O(1)
1 /** 2 * @param {string} string 3 * @return {number} 4 */ 5 var lengthOfLongestSubstring = function (s) { 6 var arr = s.split(""); 7 var nums = [], 8 len = arr.length, 9 resMax = 0, 10 index = 0; 11 while (index < len) { 12 var max = 0; 13 for (let i = 0; i < arr.length; i++) { 14 if (nums.indexOf(arr[i]) == -1) { 15 nums.push(arr[i]); 16 max = nums.length > max ? nums.length : max; 17 } else { 18 nums = []; 19 break; 20 } 21 } 22 resMax = max > resMax ? max : resMax; 23 arr.shift(); 24 index++; 25 } 26 return resMax; 27 };
方法二:滑动窗口 sliding window
思路:滑动窗口不断向前,当前元素不在set中,就加入set然后更新最大长度,i++继续下一轮循环,set中有重复元素不断让j++并删除窗口之外的元素直到滑动窗口内没有重复的元素
时间复杂度:O(n),n是字符串的长度
空间复杂度:O(∣Σ∣),其中 Σ 表示字符集(即字符串中可以出现的字符)
1 /** 2 * @param {string} s 3 * @return {number} 4 */ 5 var lengthOfLongestSubstring = function (s) { 6 const occ = new Set(); 7 const n = s.length; 8 let rk = -1, ans = 0; 9 for (let i = 0; i < n; ++i) { 10 if (i != 0) { 11 occ.delete(s.charAt(i - 1)); 12 } 13 while (rk + 1 < n && !occ.has(s.charAt(rk + 1))) { 14 occ.add(s.charAt(rk + 1)); 15 ++rk; 16 } 17 ans = Math.max(ans, rk - i + 1); 18 } 19 return ans; 20 };

浙公网安备 33010602011771号