其他分享
首页 > 其他分享> > [LeetCode] 159. Longest Substring with At Most Two Distinct Characters

[LeetCode] 159. Longest Substring with At Most Two Distinct Characters

作者:互联网

最多有两个不同字符的最长子串。题意是给一个字符串,请返回一个最长子串的长度。子串的要求是最多只有两个不同的字母。例子,

Example 1:

Input: "eceba"
Output: 3
Explanation: tis "ece" which its length is 3.

Example 2:

Input: "ccaabbb"
Output: 5
Explanation: tis "aabbb" which its length is 5.

这题依然是用到sliding window的思想。给左右两个指针,并且创建一个hashmap,key是遍历到的字母,value是字母最后一次出现位置的index。扫描的时候,一开始只让右指针移动,把遍历到的字母和当前的坐标值加入hashmap。此时最大子串的长度就是左右指针的间距。当右指针遍历到第三个不同字母的时候,需要扫描hashmap,找到value(记为leftmost)最小的那个key并且删除这个键值对。此时左指针的位置是leftmost + 1。

时间O(n)

空间O(1) - 虽然有hashmap但是size很小,只有26个字母

 1 /**
 2  * @param {string} s
 3  * @return {number}
 4  */
 5 var lengthOfLongestSubstringTwoDistinct = function (s) {
 6     let map = new Map();
 7     let left = 0;
 8     let max = 0;
 9     for (let right = 0; right < s.length; right++) {
10         map.set(s[right], right);
11         if (map.size > 2) {
12             let leftMostChar = null;
13             let leftMostIndex = Infinity;
14             for (let [char, index] of map) {
15                 if (index < leftMostIndex) {
16                     leftMostChar = char;
17                     leftMostIndex = index;
18                 }
19             }
20             map.delete(leftMostChar);
21             left = leftMostIndex + 1;
22         }
23         max = Math.max(max, right - left + 1);
24     }
25     return max;
26 };

 

标签:map,right,hashmap,159,max,字母,Two,Substring,let
来源: https://www.cnblogs.com/aaronliu1991/p/12376705.html