這是一個(gè)關(guān)于字符串的經(jīng)典問(wèn)題,給定一個(gè)字符串,求出其中最長(zhǎng)的不含有重復(fù)字符的子串。例如,給定字符串 abcabcbb,則其中最長(zhǎng)的不含重復(fù)字符的子串為 abc,長(zhǎng)度為 3。
一種解決這個(gè)問(wèn)題的方法是使用滑動(dòng)窗口。我們可以從字符串的開頭開始,逐個(gè)添加字符,直到出現(xiàn)重復(fù)字符,然后從重復(fù)字符的位置開始繼續(xù)添加字符。每次添加字符時(shí),我們可以使用一個(gè)哈希表來(lái)存儲(chǔ)字符的位置,如果當(dāng)前字符已經(jīng)出現(xiàn)過(guò),則更新哈希表中字符的位置,并更新窗口的起始位置。
具體思路如下:
當(dāng)我們遍歷字符串時(shí),可以用一個(gè)滑動(dòng)窗口來(lái)維護(hù)當(dāng)前不含重復(fù)字符的子串。每次添加字符時(shí),如果該字符在窗口中已經(jīng)出現(xiàn)過(guò),則更新窗口的起始位置,使窗口不包含重復(fù)字符。
算法的具體步驟如下:
- 定義滑動(dòng)窗口的起始位置
start和結(jié)束位置end,初始時(shí)start=0和end=0。 - 定義一個(gè)哈希表
char_index來(lái)存儲(chǔ)字符在字符串中的位置。 - 定義一個(gè)變量
max_len表示最長(zhǎng)不含重復(fù)字符的子串的長(zhǎng)度,初始時(shí)設(shè)為0。 - 遍歷字符串中的每一個(gè)字符,記當(dāng)前字符為
char,當(dāng)前字符在字符串中的位置為index。 - 如果字符
char已經(jīng)在窗口中出現(xiàn)過(guò),即字符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)過(guò),更新窗口的起始位置
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瀏覽量
10372 -
字符
+關(guān)注
關(guān)注
0文章
237瀏覽量
26124 -
字符串
+關(guān)注
關(guān)注
1文章
595瀏覽量
23107
發(fā)布評(píng)論請(qǐng)先 登錄
python字符串拼接方式了解
python3如何取出重復(fù)3次的字符串保存為3列
什么是復(fù)制字符串?Python如何復(fù)制字符串
Python字符的實(shí)例詳細(xì)說(shuō)明
2.2 python字符串類型
詳解無(wú)重復(fù)字符的最長(zhǎng)子串
Python-字符串
python字符串序列操作和不可變性
python字符串有哪些特定方法
無(wú)重復(fù)字符的最長(zhǎng)子串
Python中檢查字符串包含的方法
Python字符編碼轉(zhuǎn)換
Python如何解決無(wú)重復(fù)字符的最長(zhǎng)子串問(wèn)題
評(píng)論