网络异常,图片无法展示
|
「这是我参与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 * 104
s
由英文字母、数字、符号和空格组成
本题要我们找到不含有重复字符的最长子串,只要遍历字符串中的每个字符,并记录当前子串,当新的字符在子串中出现过,则更新子串,并记录之前长度即可。详细解题思路如下:
- 特判当输入字符为空时,返回
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-无重复字符的最长子串
如有任何问题或建议,欢迎留言讨论!