Question 3
Given a string, find the length of the longest substring without repeating characters.
Example
Input: "abcabcbb"
Output: 3
#"abc"
Input: "bbbbb"
Output: 1
#"b"
Input: "pwwkew"
Output: 3
#"wke"
题目分析
输入:随意一个字符串。
处理:找到字符串中连续出现的不重复的最长子字符串的长度,比如例子中的最后一个“pwwkew”,如果要找不重复最常字符应该是pkew,但是pkew不是原字符串的子字符串。
输出:最长子字符串的长度。
检验设置
TDD(Test-driven development) analysis:
1. 最简单的情形是最长不重复的子字符串只有一个:
"abadabc"
>>> 4
#"dabc"
2. 最长不重复的子字符串有多个:
#"abcbcabc"
>>> 3
#"abc", "bca", "cab"
1.直接解法(Python3):
题中的最重要条件是字符不重复,所以最直接的解决方法就是从字符串第一个字符开始,把不重复字符放入python字典中,当某个字符重复,则更新字典中该字符的位置。
def lengthOfLongestSubstring(s):
used = {}
#存放出现的字符串的位置
start = maxLength = 0
#start记录子字符串的起始位置,maxLength记录最长子字符串的长度
for i in range(len(s)):
if s[i] in used and start <= used[s[i]]:
start = used[s[i]] + 1
#如果检索到出现过的字符,则子字符串的起始位置从上次记录的字符后面开始,以保证新的子字符串没有重复字符
else:
maxLength = max(maxLength, i - start + 1)
used[s[i]] = i
return maxLength
时间复杂度O(n),依次分析了字符串中的所有字符;空间复杂度O(n),记录了字符串中所有不重复字符的最新位置。