無重複字符的最長子串(Go,LeetCode)

目錄

題目描述

解決方案

代碼 

代碼走讀

傳送門


 

題目描述

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

 

輸入/輸出示例:

輸入 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)
}

 

傳送門

LeetCode試題鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章