方法:动态规划
复杂度: 时间复杂度:O(N) 空间复杂度:O(N)
状态定义:dp[i]代表以i字符结尾时候 最长的无重复字符串
class Solution(object):
# 无重复字符的最长子串
# 动态规划
"""
# 输入: 'abcabcbb'
# 输出: 3
状态定义:dp[i]代表以i字符结尾时候 最长的无重复字符串 ['a', 'ab', 'abc', 'bca', 'cab', 'abc', 'cb', 'b']
状态转移方程:
如果:s[i] 在 dp[i-1] 中 如 dp[i-1]:abc s[i]:a 则 寻找a在dp[i-1]中的位置,截取a位置之后在加上a 则为dp[i]
如果:s[i]不在dp[i-1]中 则直接在dp[i-1]后直接加即可。
时间复杂度:O(N)
空间复杂度:O(N)
"""
def lengthOfLongestSubstring(self, s):
n = len(s)
if n == 0:
return 0
dp = [0] * n
dp[0] = s[0]
maxlen = 1
for i in range(1, n):
if s[i] not in dp[i-1]:
dp[i] = dp[i-1] + s[i]
else:
ind = dp[i-1].index(s[i])
dp[i] = dp[i - 1][ind+1:] + s[i]
maxlen = max(maxlen, len(dp[i]))
return maxlen
# ['a', 'ab', 'abc', 'bca', 'cab', 'abc', 'cb', 'b']
# s = 'abcabcbb'
s = " "
solution = Solution()
print(solution.lengthOfLongestSubstring(s))