3. 无重复字符的最长子串
2020-03-12
无重复字符的最长子串
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例:
输入: abcabcbb
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
输入: pwwkew
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
说明:
- 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
题解:
思路1:双指针暴力解
两个for循环暴力拆解。for中套for效率特别低。
var lengthOfLongestSubstring = function (s) { let obj = {}; // 声明一个对象用s[i]作为key存储当前记录中有哪些字符串 let len = 0; // obj中记录的key的长度 let result = 0; // 返回的最长字串长度 for (let i = 0; i < s.length; i++) { // 第一个指针 obj[s[i]] = true; // 每次更新第一个指针先把当前s[i]作为obj的第一个key存进去 len = 1; for (let j = i + 1; j < s.length; j++) { // 第二个指针 从i之后开始遍历 if (!obj[s[j]]) { // 如果obj中没有记录则记录进去 obj[s[j]] = true; len++; result = Math.max(result, len); // 当遍历到s.length时需要取一次最大值 所以写这一条 } else { result = Math.max(result, len); // 如果obj中已经有了这个key则说明重复了,取较大值作为result obj = {}; // 将obj清空 break; // 退出第二指针 } } } return Math.max(result, len); }
思路2:滑动窗口
用一个子数组记录存入的子字符串,每次循环一个新的子字符串都判断数组中是否存在
function lengthOfLongestSubstring(s) { if (s.length < 2) { // 如果s的长度小于2直接返回就行了 return s.length; } s = s.split(''); // 将s打散成数组 let sonArr = []; // 记录无重复字串的子数组 let len = 0; // 记录最大长度 for (let i = 0; i < s.length; i++) { // 循环s let index = sonArr.indexOf(s[i]); if (index < 0) { // 如果子数组中没有,直接push进去 sonArr.push(s[i]); } else { len = Math.max(sonArr.length, len); // 如果子数组中已经存在当前的s[i],
// 那么获取当前子数组长度和len的长度比较,取较大值赋值len sonArr.splice(0, index + 1); // 由于子数组是无重复字串的数组,出现重复的项则要把原来项之前的去掉才能放进重复项 sonArr.push(s[i]); // 子数组已经把上一次出现的s[i]截取了,把新出现的s[i]插入 } } return Math.max(sonArr.length, len); }