给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
解题思路
首先要明白这个题的意思,就是要我们求字符串的不重复的连续子串,首先必须是连续的,不能断开,其次子串中不能有一个字母是重复的。弄清楚了题目的意思后,让我们来看看解法。
1)暴力法:暴力法总是最容易让人明白的方法,首先我们拿到字符串的所有子串,这个通过两次循环可以实现拿到所有字串的区间,这里我们采用[i,j)(左闭右开)的区间。然后我们实现一个方法,这个方法用来判断传入的字符串在一段区间内是否存在重复,这个可以借助set来实现。假设这段区间内的字串没有重复字符,那么我们就要去对比更新最大字串的值。代码如下:
var lengthOfLongestSubstring = function(s) {
let sum = 0,length = s.length;
for(let i = 0; i < length; i++){
for(let j = i + 1; j <= length; j++){
sum = uniqueStr(s, i , j) && sum < j - i ? sum = j - i : sum;
}
}
return sum;
};
function uniqueStr( s, i, j){
let arr = [];
for(let n = i; n < j; n++){
if(arr.includes(s.charAt(n))){
return false;
}
arr.push(s.charAt(n));
}
return true;
}
上面的方法可能还不是最优的,如果大家有什么疑问或者有更好的方法,欢迎留言讨论,谢谢!