🥈Medium
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: "abcabcbb"输出: 3解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: "bbbbb"输出: 1解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: "pwwkew"输出: 3解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
题解
思路清晰的话,做起来还是比较简单的。遍历整个字符串,遍历的同时需要把遍历过的字符存储到数组(哈希表)temp中,遍历下一个字符的同时搜索该字符是否在temp中存在,如果存在,就需要把该字符第一次出现的位置之前字符清空,接着遍历
Python
class Solution:def lengthOfLongestSubstring(self, s: str) -> int:if not s:return 0temp=[]maxlength=0length = 0for i in s:if i not in temp:temp.append(i)else:begin = temp.index(i)length = len(temp)if (length>maxlength):maxlength = lengthtemp = temp[begin+1:]temp.append(i)length = 0if (len(temp)>maxlength):maxlength = len(temp)return maxlength
上面用了数组来存储之前的字符,搜索的时间会是,所以需要改成哈希表,需要用set
class Solution:def lengthOfLongestSubstring(self, s: str) -> int:# 哈希集合,记录每个字符是否出现过occ = set()n = len(s)# 右指针,初始值为 -1,相当于我们在字符串的左边界的左侧,还没有开始移动rk, ans = -1, 0for i in range(n):if i != 0:# 左指针向右移动一格,移除一个字符occ.remove(s[i - 1])while rk + 1 < n and s[rk + 1] not in occ:# 不断地移动右指针occ.add(s[rk + 1])rk += 1# 第 i 到 rk 个字符是一个极长的无重复字符子串ans = max(ans, rk - i + 1)return ans
JavaScript
var lengthOfLongestSubstring = function(s) {// 哈希集合,记录每个字符是否出现过const occ = new Set();const n = s.length;// 右指针,初始值为 -1,相当于我们在字符串的左边界的左侧,还没有开始移动let rk = -1, ans = 0;for (let i = 0; i < n; ++i) {if (i != 0) {// 左指针向右移动一格,移除一个字符occ.delete(s.charAt(i - 1));}while (rk + 1 < n && !occ.has(s.charAt(rk + 1))) {// 不断地移动右指针occ.add(s.charAt(rk + 1));++rk;}// 第 i 到 rk 个字符是一个极长的无重复字符子串ans = Math.max(ans, rk - i + 1);}return ans;};
