题目给定一个字符串,请你找出其中不含有重复字符的 最长子串的长度。
示例 1:
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: s = “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: s = “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:遍历!提取出所有的子串,从字符串的第一个字符开始,循环记录下所有的子串的长度,然后输出即可。
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
str_num=[]
if s=="":
return 0
else:
for j in range(len(s)):
s0=s[j:]
str1=""
for i in s0:
if i not in str1:
str1+=i
else:
break
str_num.append(len(str1))
return max(str_num)
一个较为简单的中等题~~但此方法在s较为复杂时是不太实用的,从时间和内存消耗来看,结果并不是很好!上面我遍历了所有子串,参考答案有一种仅需一次遍历的方法如下:此方法的思想仍是遍历,但它仅实用一个辅助变量来暂存子串,如果不在就记录此字符,如果存在则删除此字符之前的部分!这样就只需要进行一次遍历!
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
# 使用一个辅助变量来暂时存储匹配的子串
ans = ''
tep = ''
for i in s:
# 遍历,若不重复则记录该字符
if i not in tep:
tep += i
# 如果遇到了已经存在的字符,则找到该字符所在位置,删除该字符,并保留该位置之后的子串,并把当前字符加入到最后,完成更新
else:
tep = tep[tep.index(i)+1:]
tep += i
# 如果是当前最长的,就替换掉之前存储的最长子串
if len(tep) > len(ans):
ans = tep
return len(ans)
作者:Joe_99
链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/solution/si-lu-qing-xi-yi-ci-bian-li-gao-xiao-qiu-jie-by-jo/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。