1. 程式人生 > >Go語言的LeetCode刷題之旅-003-無重複字元的最長子串

Go語言的LeetCode刷題之旅-003-無重複字元的最長子串

Go語言的LeetCode刷題之旅-03-無重複字元的最長子串

題目:

給定一個字串,找出不含有重複字元的最長子串的長度。

示例:

給定 “abcabcbb” ,沒有重複字元的最長子串是 “abc” ,那麼長度就是3。

給定 “bbbbb” ,最長的子串就是 “b” ,長度是1。

給定 “pwwkew” ,最長子串是 “wke” ,長度是3。請注意答案必須是一個子串,”pwke” 是 子序列 而不是子串。

思路:

利用s[left:i+1]來表示s[:i+1]中的包含s[i]的最長子字串。 location[s[i]]是字元s[i]在s[:i+1]中倒數第二次出現的序列號。 當left < location[s[i]]的時候,說明字元s[i]出現了兩次。需要設定 left = location[s[i]] + 1, 保證字元s[i]只出現一次。

Go程式碼:

package main

func lengthOfLongestSubstring(s string) int {
    // location[s[i]] == j 表示:
    // s中第i個字串,上次出現在s的j位置,所以,在s[j+1:i]中沒有s[i]
    // location[s[i]] == -1 表示: s[i] 在s中第一次出現
    location := [256]int{} // 只有256長是因為,假定輸入的字串只有ASCII字元
    for i := range location {
        location[i] = -1
// 先設定所有的字元都沒有見過 } maxLen, left := 0, 0 for i := 0; i < len(s); i++ { // 說明s[i]已經在s[left:i+1]中重複了 // 並且s[i]上次出現的位置在location[s[i]] if location[s[i]] >= left { left = location[s[i]] + 1 // 在s[left:i+1]中去除s[i]字元及其之前的部分 } else if i+1-left > maxLen { // fmt.Println(s[left:i+1])
maxLen = i + 1 - left } location[s[i]] = i } return maxLen }

總結:

利用Location儲存字元上次出現的序列號,避免了查詢工作。location和Two Sum中的m是一樣的作用。

// m 負責儲存map[整數]整數的序列號
    m := make(map[int]int, len(nums))

相關推薦

Go語言LeetCode-003-重複字元長子

Go語言的LeetCode刷題之旅-03-無重複字元的最長子串 題目: 給定一個字串,找出不含有重複字元的最長子串的長度。 示例: 給定 “abcabcbb” ,沒有重複字元的最長子串是 “abc” ,那麼長度就是3。 給定 “bbbbb” ,

LeetCode筆記(三)重複字元長子

題目:給定一個字串,找出不含有重複字元的最長子串的長度。示例:    給定 "abcabcbb" ,沒有重複字元的最長子串是 "abc" ,那麼長度就是3。    給定 "bbbbb" ,最長的子串就是 "b" ,長度是1。    給定 "pwwkew" ,最長子串是 "wk

Go語言LeetCode-002-兩數相加

Go語言的LeetCode刷題之旅-02-兩數相加 題目: 給定兩個非空連結串列來表示兩個非負整數。位數按照逆序方式儲存,它們的每個節點只儲存單個數字。將兩數相加返回一個新的連結串列。 你可以假設除了數字 0 之外,這兩個數字都不會以零開頭。 示

leetcode(63)不同路徑II

題目描述 一個機器人位於一個 m x n 網格的左上角 (起始點在下圖中標記為“Start” )。 機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角(在下圖中標記為“Finish”)。 現在考慮網格中有障礙物。那麼從左上角到右下角將會有多少條不同的路徑?

leetcode(145)二叉樹的後序遍歷

題目描述 給定一個二叉樹,返回它的 後序 遍歷。 樣例 輸入: [1,null,2,3] 1 \ 2 / 3 輸出: [3,2,1] 思路分析 方法一:遞迴,按照後序遍歷“左右根”的順序,依次遍歷,遞迴即可 方

leetcode(40)組合總和2

題目描述 給定一個數組 candidates 和一個目標數 target ,找出 candidates 中所有可以使數字和為 target 的組合。 candidates 中的每個數字在每個組合中只能使用一次。 說明: 所有數字(包括目標數)都是正整數。 解集不能包

leetcode(46)全排列

題目描述 給定一個沒有重複數字的序列,返回其所有可能的全排列。 樣例 輸入: [1,2,3] 輸出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] 思路分析 典型的回

C#LeetCode#104-二叉樹的大深度​​​​​​​(Maximum Depth of Binary Tree)

問題 給定一個二叉樹,找出其最大深度。 二叉樹的深度為根節點到最遠葉子節點的最長路徑上的節點數。 說明: 葉子節點是指沒有子節點的節點。 給定二叉樹 [3,9,20,null,null,15,7],        3       / \    9   20   /

leetcode重複長子

題目要求:        給定一個字串,找出不含有重複字元的 最長子串 的長度。示例:給定 "abcabcbb" ,沒有重複字元的最長子串是 "abc" ,那麼長度就是3。給定 "bbbbb" ,最長的

leetcode 路 68 Gas Station

rom 說明 之路 bsp margin tom otto mono lee There are N gas stations along a circular route, where the amount of gas at station i is gas[i]

leetcode 字符反轉

solution arr reverse eof HA rev code toc val 請編寫一個函數,其功能是將輸入的字符串反轉過來。 示例: 輸入:s = "hello" 返回:"olleh" 註:這裏之所以不使用倒敘遍歷strs,是因為字符串拼接的效率很低,str+

【CTF】XCTF嘉年華體驗賽逆向re2的writeup

這道題採用動靜結合的方法嘗試了一下 動態除錯的時候想加快進度  跳過sleep()  遇到那兩個jle跳轉   直接修改SF標誌位為0來修改執行流程  可以看到 左側箭頭會變成虛線 對了   第三個jle在s

【CTF】XCTF嘉年華體驗賽逆向re1的詳細writeup

看了xctf訓練平臺 發現了這道題  可以用兩種方法 最簡單的就是用angr跑一下   過程不再列舉(我試過了 可以成功) 具體方法可以看安裝使用Angr符號執行來求解CTF逆向題 還有就是用指令碼跑一下 載入IDA x32(雖然後綴是.p

【jarvisoj】pwn題目Tell Me Something的writeup

題目資訊: file一下  發現是64位的ELF checksec檢查下安全性 objdump -t 檔名   可以檢視符號表 [email protected]:~/Desktop/jarvisOJ$ objdump -

C#LeetCode#374-猜數字大小(Guess Number Higher or Lower)

問題 我們正在玩一個猜數字遊戲。 遊戲規則如下: 我從 1 到 n 選擇一個數字。 你需要猜我選擇了哪個數字。 每次你猜錯了,我會告訴你這個數字是大了還是小了。 你呼叫一個預先定義好的介面 guess(int num),它會返回 3 個可能的結果(-1,1 或 0): -1 :

C#LeetCode#704-二分查詢(Binary Search)

問題 給定一個 n 個元素有序的(升序)整型陣列 nums 和一個目標值 target  ,寫一個函式搜尋 nums 中的 target,如果目標值存在返回下標,否則返回 -1。 輸入: nums = [-1,0,3,5,9,12], target = 9 輸出:

C#LeetCode#278-第一個錯誤的版本(First Bad Version)

問題 你是產品經理,目前正在帶領一個團隊開發新的產品。不幸的是,你的產品的最新版本沒有通過質量檢測。由於每個版本都是基於之前的版本開發的,所以錯誤的版本之後的所有版本都是錯的。 假設你有 n 個版本 [1, 2, ..., n],你想找出導致之後所有版本出錯的第一個錯誤的版本。 你可

C#LeetCode#824-山羊拉丁文(Goat Latin)

問題 給定一個由空格分割單詞的句子 S。每個單詞只包含大寫或小寫字母。 我們要將句子轉換為 “Goat Latin”(一種類似於 豬拉丁文 - Pig Latin 的虛構語言)。 山羊拉丁文的規則如下: 如果單詞以母音開頭(a, e, i, o, u),在單詞後新增"ma"。 例

C#LeetCode#819-常見的單詞(Most Common Word)

問題 給定一個段落 (paragraph) 和一個禁用單詞列表 (banned)。返回出現次數最多,同時不在禁用列表中的單詞。題目保證至少有一個詞不在禁用列表中,而且答案唯一。 禁用列表中的單詞用小寫字母表示,不含標點符號。段落中的單詞不區分大小寫。答案都是小寫字母。 輸入:

C#LeetCode#788-旋轉數字(Rotated Digits)

問題 我們稱一個數 X 為好數, 如果它的每位數字逐個地被旋轉 180 度後,我們仍可以得到一個有效的,且和 X 不同的數。要求每位數字都要被旋轉。 如果一個數的每位數字被旋轉以後仍然還是一個數字, 則這個數是有效的。0, 1, 和 8 被旋轉後仍然是它們自己;2 和 5 可以互相旋轉成