3 無重複字符的最長子串
最近好久沒有更新文章了,就更新一篇 LeetCode 的一篇算法的題目.
題目描述
給定一個字符串,請你找出其中不含有重複字符的 最長子串 的長度。
示例 1:
輸入: “abcabcbb”
輸出: 3
解釋: 因爲無重複字符的最長子串是 “abc”,所以其長度爲 3。
示例 2:
輸入: “bbbbb”
輸出: 1
解釋: 因爲無重複字符的最長子串是 “b”,所以其長度爲 1。
示例 3:
輸入: “pwwkew”
輸出: 3
解釋: 因爲無重複字符的最長子串是 “wke”,所以其長度爲 3。
請注意,你的答案必須是 子串 的長度,“pwke” 是一個子序列,不是子串。
思路分析:
遍歷字符串
定義一個變量 要求 從 start 到 x-1 位置都是 不重複的字串
要定義一個字典 記錄 字符與字符上一次出現的位置的映射.
保證 從 start 到 x-1 這段數據 都是 不重複的.
定義一個 字典 last_occured, 記錄 關係: 記錄 字符與所在位置index 的對應關係
- 如果 新訪問的 X ,不在 laste_occured 裏面 ,這說明從來沒有出現過,
或者 last_occured[X] 的index 的下標在start 之前 這裏說明 這個X 可以加入到 這個start–> j-1 這個長度裏面.
如果新訪問的X 在 last_occured 裏面 , new_index= last_occred[X] 並且下標在 start 之後 出現, 那麼說明從 start 到 j-1 的閉區間裏面出現過該值.
需要 更新 start 的位置, 使其滿足 從start -->j-1 位置 是沒有重複的字串. start 要更新到 new_index+1 的位置 .
比如這種情況
此時就要更新 start 的值,更新 start = last_occured[X]+1 的位置
圖片3
- 更新 當前 訪問的 index-start +1 是否大於 max_length 如果大於 則進行更新,否則不進行更新.
- 更新 last_occred 字典. 把字符 和對應的index 信息保存下來.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
@Time : 2019/6/17 14:12
@File : length_of_none_repeat_string.py
@Author : [email protected]
refer :
https://blog.csdn.net/tuobicui6522/article/details/80099897
題目地址:
3. 無重複字符的最長子串
https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/
"""
def max_length_of_no_repeat_substring(s: str) -> int:
# 記錄出現字符 與 index 的映射
last_occured = dict()
start = 0
max_length = 0
for i, char in enumerate(s):
last_index = last_occured.get(char)
if last_index is not None and last_index >= start:
start = last_index + 1
if i - start + 1 > max_length:
max_length = i - start + 1
last_occured[char] = i
return max_length
if __name__ == '__main__':
print(max_length_of_no_repeat_substring("abcabcbb")) # 3
print(max_length_of_no_repeat_substring("bbbbb")) # 1
print(max_length_of_no_repeat_substring("pwfwkew"))# 4
print(max_length_of_no_repeat_substring("")) # 0
print(max_length_of_no_repeat_substring("a")) # 1
print(max_length_of_no_repeat_substring("abcdef"))# 6
pass
最近在學習go 語言,所以下面也給是go 語言的實現版本
下面用go 語言實現一下:
package main
import "fmt"
/*
https://blog.csdn.net/tuobicui6522/article/details/80099897
給定一個字符串,請你找出其中不含有重複字符的 最長子串 的長度。
示例 1:
輸入: "abcabcbb"
輸出: 3
解釋: 因爲無重複字符的最長子串是 "abc",所以其長度爲 3。
示例 2:
輸入: "bbbbb"
輸出: 1
解釋: 因爲無重複字符的最長子串是 "b",所以其長度爲 1。
示例 3:
輸入: "pwwkew"
輸出: 3
解釋: 因爲無重複字符的最長子串是 "wke",所以其長度爲 3。
請注意,你的答案必須是 子串 的長度,"pwke" 是一個子序列,不是子串。
*/
func lengthOfNonRepeatingSubStr(s string) int {
lastOccurred := make(map[rune]int) //記錄字符最後出現的位置
start := 0
maxLength := 0
for i, ch := range []rune(s) {
// 遍歷字符串
if lastI, ok := lastOccurred[ch]; ok && lastI >= start {
start = lastI + 1
}
if i-start+1 > maxLength {
maxLength = i - start + 1
}
lastOccurred[ch] = i
}
return maxLength
}
func main() {
//s := "abcdaddbcbb"
fmt.Println(
lengthOfNonRepeatingSubStr("abcabcbb"))
fmt.Println(
lengthOfNonRepeatingSubStr("bbbbb"))
fmt.Println(
lengthOfNonRepeatingSubStr("pwwkew"))
fmt.Println(
lengthOfNonRepeatingSubStr(""))
fmt.Println(
lengthOfNonRepeatingSubStr("b"))
fmt.Println(
lengthOfNonRepeatingSubStr("abcdef"))
fmt.Println(
lengthOfNonRepeatingSubStr("一二三二一"))
}
參考文檔
go語言實現–尋找最長不含有重複字符的子串 https://blog.csdn.net/tuobicui6522/article/details/80099897