给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: "abcabcbb"输出: 3解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: "bbbbb"输出: 1解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: "pwwkew"输出: 3解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
解法1:双循环逐个遍历
var lengthOfLongestSubstring = function (s) {var size = s.length;var max = 0;for (let i = 0; i < size; i++) {if (max + i >= size) break;var m = s[i];for (let j = i + 1; j < size; j++) {if (m.indexOf(s[j]) === -1) {m += s[j];}else {max = Math.max(max, m.length);break;}}max = Math.max(max, m.length);}return max;};
解法2:维护数组
var lengthOfLongestSubstring = function (s) {var result = [];var max = 0;for (let i = 0; i < s.length; i++) {const index = result.indexOf(s[i]);if (index !== -1) {result.splice(0, index + 1);}result.push(s[i]);max = Math.max(max, result.length);}return max;}
解法3:维护不重复的map
var lengthOfLongestSubstring = function (s) {var map = new Map();var max = 0;for (let i = 0, j = 0; i < s.length; i++) {//滑动指针到最后面if (map.has(s[i])) {j = Math.max(map.get(s[i]) + 1, j);}map.set(s[i], i);//j和i之间为最长无重复字符max = Math.max(max, i - j + 1);}return max;}
