3.無重複字符的最長子串

3 無重複字符的最長子串

最近好久沒有更新文章了,就更新一篇 LeetCode 的一篇算法的題目.

題目描述

給定一個字符串,請你找出其中不含有重複字符的 最長子串 的長度。

示例 1:

輸入: “abcabcbb”
輸出: 3
解釋: 因爲無重複字符的最長子串是 “abc”,所以其長度爲 3。

示例 2:

輸入: “bbbbb”
輸出: 1
解釋: 因爲無重複字符的最長子串是 “b”,所以其長度爲 1。

示例 3:

輸入: “pwwkew”
輸出: 3
解釋: 因爲無重複字符的最長子串是 “wke”,所以其長度爲 3。
請注意,你的答案必須是 子串 的長度,“pwke” 是一個子序列,不是子串。

思路分析:

遍歷字符串

定義一個變量 要求 從 start 到 x-1 位置都是 不重複的字串
要定義一個字典 記錄 字符與字符上一次出現的位置的映射.

圖片1
圖片1

保證 從 start 到 x-1 這段數據 都是 不重複的.

定義一個 字典 last_occured, 記錄 關係: 記錄 字符與所在位置index 的對應關係

  1. 如果 新訪問的 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 的位置 .

比如這種情況

圖片2

img2

此時就要更新 start 的值,更新 start = last_occured[X]+1 的位置

圖片3
圖片3
img3

  1. 更新 當前 訪問的 index-start +1 是否大於 max_length 如果大於 則進行更新,否則不進行更新.
  2. 更新 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

分享快樂,留住感動. '2019-06-22 07:17:25' --frank
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章