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 };

 

posted @ 2021-05-25 15:00  icyyyy  阅读(43)  评论(0)    收藏  举报