您好,登錄后才能下訂單哦!
這篇文章給大家介紹golang中怎么利用leetcode 實(shí)現(xiàn)一個(gè)無(wú)重復(fù)字符的最長(zhǎng)子串,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
給定一個(gè)字符串,請(qǐng)你找出其中不含有重復(fù)字符的 最長(zhǎng)子串 的長(zhǎng)度。
示例 1:
輸入: "abcabcbb" 輸出: 3 解釋: 因?yàn)闊o(wú)重復(fù)字符的最長(zhǎng)子串是 長(zhǎng)度為 3。
示例 2:
輸入: "bbbbb" 輸出: 1 解釋: 因?yàn)闊o(wú)重復(fù)字符的最長(zhǎng)子串是 ,所以其長(zhǎng)度為 1。
示例 3:
輸入: "pwwkew" 輸出: 3 解釋: 因?yàn)闊o(wú)重復(fù)字符的最長(zhǎng)子串是 ,所以其長(zhǎng)度為 3。 請(qǐng)注意,你的答案必須是 子串 的長(zhǎng)度, 是一個(gè)不是子串。
解題思路:
1,這是一個(gè)滑動(dòng)窗口題目,需要移動(dòng)左右指針
2,判斷字符是否重復(fù)的題目,一般都用hashmap,用空間換時(shí)間
3,由于hashmap只需要表示字符存在不存在,可以用來(lái)存這個(gè)字符在串中的位置(從1開(kāi)始),這是一個(gè)小技巧
4,如果字符沒(méi)有出現(xiàn)過(guò)則右指針右移,長(zhǎng)度增加
5,如果出現(xiàn)過(guò),
A,如果出現(xiàn)的位置在左指針之前,記錄當(dāng)前位置到左指針的長(zhǎng)度,并和最大長(zhǎng)度比較(即左指針不移)
B,如果出現(xiàn)的位置在左指針之后,顯然比當(dāng)前長(zhǎng)度短,就不用比較了,(即左指針移到上一次出現(xiàn)的位置的下一個(gè)地方)
6,更新hashmap中字符出現(xiàn)的位置為這一次最新出現(xiàn)的位置
寫(xiě)法1:
func lengthOfLongestSubstring(s string) int { m:=make(map[byte]int) res:=0 left:=0 for i:=0;i < len(s);i++{ if m[s[i]] >0 && left< m[s[i]]{ left= m[s[i]] } m[s[i]] = i + 1 if i-left+1>res{ res=i-left+1 } }return res}
寫(xiě)法2:
func lengthOfLongestSubstring(s string) int {
m:=make(map[byte]int)
res:=0
left:=0
for i:=0;i < len(s);i++{
if m[[]byte(s)[i]] == 0 || m[[]byte(s)[i]] < left{
res = max(res, i - left + 1)
} else {
left = m[s[i]]
}
m[s[i]] = i + 1
}
return res
}
func max(a,b int)int{
if a>b{
return a
}
return b
}
關(guān)于golang中怎么利用leetcode 實(shí)現(xiàn)一個(gè)無(wú)重復(fù)字符的最長(zhǎng)子串就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。