這是一個(gè)關(guān)于字符串的經(jīng)典問題,給定一個(gè)字符串,求出其中最長(zhǎng)的不含有重復(fù)字符的子串。例如,給定字符串 abcabcbb
,則其中最長(zhǎng)的不含重復(fù)字符的子串為 abc
,長(zhǎng)度為 3
。
一種解決這個(gè)問題的方法是使用滑動(dòng)窗口。我們可以從字符串的開頭開始,逐個(gè)添加字符,直到出現(xiàn)重復(fù)字符,然后從重復(fù)字符的位置開始繼續(xù)添加字符。每次添加字符時(shí),我們可以使用一個(gè)哈希表來存儲(chǔ)字符的位置,如果當(dāng)前字符已經(jīng)出現(xiàn)過,則更新哈希表中字符的位置,并更新窗口的起始位置。
具體思路如下:
當(dāng)我們遍歷字符串時(shí),可以用一個(gè)滑動(dòng)窗口來維護(hù)當(dāng)前不含重復(fù)字符的子串。每次添加字符時(shí),如果該字符在窗口中已經(jīng)出現(xiàn)過,則更新窗口的起始位置,使窗口不包含重復(fù)字符。
算法的具體步驟如下:
- 定義滑動(dòng)窗口的起始位置
start
和結(jié)束位置end
,初始時(shí)start=0
和end=0
。 - 定義一個(gè)哈希表
char_index
來存儲(chǔ)字符在字符串中的位置。 - 定義一個(gè)變量
max_len
表示最長(zhǎng)不含重復(fù)字符的子串的長(zhǎng)度,初始時(shí)設(shè)為0
。 - 遍歷字符串中的每一個(gè)字符,記當(dāng)前字符為
char
,當(dāng)前字符在字符串中的位置為index
。 - 如果字符
char
已經(jīng)在窗口中出現(xiàn)過,即字符char
在哈希表char_index
中對(duì)應(yīng)的值不為0
,并且該值大于等于窗口的起始位置start
,則更新窗口的起始位置start
為char_index[char] + 1
。 - 更新窗口的結(jié)束位置
end
為index
,并更新哈希表char_index
中字符char
對(duì)應(yīng)的值為index
。 - 更新最長(zhǎng)不含重復(fù)字符的子串的長(zhǎng)度
max_len
,即max_len = max(max_len, end - start + 1)
。 - 重復(fù)步驟 4-7,直到遍歷完整個(gè)字符串。
- 返回最長(zhǎng)不含重復(fù)字符的子串的長(zhǎng)度
max_len
。
以下是一個(gè)用 Python 實(shí)現(xiàn)的示例代碼:
def length_of_longest_substring(s: str) -> int:
# 定義窗口的起始位置和結(jié)束位置
start: int = 0
end: int = 0
# 定義一個(gè)哈希表存儲(chǔ)字符的位置
char_index: dict = {}
# 最長(zhǎng)不含重復(fù)字符的子串的長(zhǎng)度
max_len: int = 0
# 遍歷字符串
for index, char in enumerate(s):
# 如果字符 char 已經(jīng)在窗口中出現(xiàn)過,更新窗口的起始位置
if char in char_index and char_index[char] >= start:
start = char_index[char] + 1
# 更新窗口的結(jié)束位置和窗口中字符 char 的位置
end = index
char_index[char] = index
# 更新最長(zhǎng)不含重復(fù)字符的子串的長(zhǎng)度
max_len = max(max_len, end - start + 1)
return max_len
使用該算法,我們可以輸入字符串 abcabcbb
,得到最長(zhǎng)不含重復(fù)字符的子串的長(zhǎng)度 3
,即為題目中給出的示例的答案。
-
ABC
+關(guān)注
關(guān)注
0文章
12瀏覽量
8854 -
字符
+關(guān)注
關(guān)注
0文章
232瀏覽量
25154 -
字符串
+關(guān)注
關(guān)注
1文章
575瀏覽量
20470
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論