「这是我参与11月更文挑战的第16天,活动详情查看:2021最后一次更文挑战」
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列, 不是子串。
示例 4:
输入: s = ""
输出: 0
提示:
0 <= s.length <= 5 * 104s由英文字母、数字、符号和空格组成
本题要我们找到不含有重复字符的最长子串,只要遍历字符串中的每个字符,并记录当前子串,当新的字符在子串中出现过,则更新子串,并记录之前长度即可。详细解题思路如下:
- 特判当输入字符为空时,返回
0 - 创建变量
str记录当前子串,初始化为空字符串,创建变量max记录最长子串长度,因为此时字符串不为空,所以初始化为1 - 遍历字符串,如果该字符在
str中没有出现过,则str += s[i],否则通过当前子串长度尝试更新max,然后更新当前子串为前一个重复字符之后的字符加s[i] - 最后返回
max和最后子串的长度的最大值
代码如下:
var lengthOfLongestSubstring = function(s) {
// 特判
if(s==='') return 0;
// 子串
str = '',
// 最长子串的长度
max = 1;
// 遍历每个字符
for(let i = 0;i<s.length;i++){
const ind = str.indexOf(s[i])
// 如果该字符在子串中现过
if(ind>-1){
// 尝试更新最大子串长度
max = Math.max(max,str.length)
// 更新子串
str = str.substr(ind+1)+s[i]
}else{
// 如果未出现过,累加字符串
str += s[i]
}
}
// 返回结果
return Math.max(max,str.length);
};
至此我们就完成了 leetcode-3-无重复字符的最长子串
如有任何问题或建议,欢迎留言讨论!