目錄
題目描述
給定一個字符串,請你找出其中不含有重複字符的 最長子串 的長度。
輸入/輸出示例:
輸入 | abcabcbb |
輸出 | 3 |
解釋 | 因爲無重複字符的最長子串是“abc”,所以其長度爲3 |
解決方案
這個問題本質上是一個隊列應用問題。我們依次將元素放入隊列中,在入隊列的時候檢查要入隊列的元素是否存在於隊列中。如果存在,需要將隊列中不斷的彈出元素,直到把重複的該元素彈出,然後再將該元素入隊列。此外,隊列中需要有一個變量記錄隊列長度的最長記錄,在所有字符都完成過入隊列操作後,將該記錄返回。
代碼
package main
func lengthOfLongestSubstring(s string) int {
queue := CreateQueue()
for _, char := range s {
queue.Push(char)
}
return queue.MaxLength
}
type Queue struct {
Base []int32
base map[int32]string
MaxLength int
}
func CreateQueue() *Queue {
queue := new(Queue)
queue.base = make(map[int32]string)
return queue
}
func (q *Queue) Push(data int32) {
if q.Exist(data) {
q.Remove(data)
}
q.Base = append(q.Base, data)
q.base[data] = ""
if q.Length() > q.MaxLength {
q.MaxLength = q.Length()
}
}
func (q *Queue) Exist(data int32) bool {
_, ok := q.base[data]
return ok
}
func (q *Queue) Remove(data int32) {
for {
element := q.Pop()
if element == data {
break
}
}
}
func (q *Queue) Pop() int32 {
element := q.Base[0]
q.Base = q.Base[1:]
delete(q.base, element)
return element
}
func (q *Queue) Length() int {
return len(q.Base)
}
代碼走讀
package main
import "fmt"
// 解決函數(LeetCode定義)
func lengthOfLongestSubstring(s string) int {
queue := CreateQueue()
for _, char := range s {
queue.Push(char)
}
return queue.MaxLength
}
// 隊列結構定義。數據存儲在Base中,MaxLength表示最大長度記錄
type Queue struct {
Base []int32
base map[int32]string
MaxLength int
}
// 隊列初始化
func CreateQueue() *Queue {
queue := new(Queue)
queue.base = make(map[int32]string)
return queue
}
// 往隊列中放入一個元素。如果該元素存在,則將該元素和該元素之前的所有元素彈出隊列,然後再將該元素放入隊列
func (q *Queue) Push(data int32) {
if q.Exist(data) {
q.Remove(data)
}
q.Base = append(q.Base, data)
q.base[data] = ""
// 判斷長度是否超過了記錄最大值
if q.Length() > q.MaxLength {
q.MaxLength = q.Length()
}
}
// 判斷隊列是否存在。base的意義在於查詢比Base要快
func (q *Queue) Exist(data int32) bool {
_, ok := q.base[data]
return ok
}
// 從隊列中彈出指定的元素,彈出的同時也會將該元素之前的所有元素彈出
func (q *Queue) Remove(data int32) {
for {
element := q.Pop()
if element == data {
break
}
}
}
// 從隊列頭彈出一個元素
func (q *Queue) Pop() int32 {
element := q.Base[0]
q.Base = q.Base[1:]
delete(q.base, element)
return element
}
// 求隊列長度
func (q *Queue) Length() int {
return len(q.Base)
}
// 自測用例
func main() {
result := lengthOfLongestSubstring("abcabcbb")
fmt.Println(result)
}