Given a string, find the length of the longest substring without repeating characters.
Example 1:
Input: "abcabcbb"
Output: 3
Explanation: The answer is "abc", with the length of 3.
Example 2:
Input: "bbbbb"
Output: 1
Explanation: The answer is "b", with the length of 1.
Example 3:
Input: "pwwkew"
Output: 3
Explanation: The answer is "wke", with the length of 3.
Note that the answer must be a substring, "pwke" is a subsequence and not a substring.
本题要求计算出字符串中最长不重复子串的长度。值得注意的是,需要考虑字符串为空,或空格的情况。
最简单的方法:
for
循环遍历最容易理解,然而效率非常低下,只有16%的超越率
/**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function(s) {
const len=s.length;
if(!len){return 0};
let sum=1;
for(let i=0;i<len;i++){
const array=[];
let temp=0;
for(let j=i;j<len;j++){
if(array.indexOf(s[j])==-1){
temp++;
array.push(s[j]);
}else{
break;
}
}
sum=temp>sum?temp:sum;
}
return sum;
};
哈希表:
ES6支持Map集合,所以可尝试使用哈希表求解减少查找时间,通过后有36%的超越率。
/**
* TestCase: [' ','','au','abba']
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function(s) {
let sum=0;
const map=new Map();
for(let i=0,firstIndex=0,len=s.length;i<len;i++){
//获得最先重复字符的位置,如'abba',遍历到a,则重复字符的位置为2
if(map.has(s[i])){
firstIndex=firstIndex>map.get(s[i])?firstIndex:map.get(s[i]);
}
//最大长度赋值
//根据最后重复字符的位置,计算重复子串的间隔(i-lastIndex+1)
// 加1是因为数组从0开始,如'au'
sum=(i-firstIndex+1)>sum?(i-firstIndex+1):sum;
//以1开始计数
map.set(s[i],i+1);
}
return sum;
};