日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python字符串中最长的连续升序子串_Leetcode刷题练Python无重复字符的最长子串

發(fā)布時(shí)間:2024/1/23 python 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python字符串中最长的连续升序子串_Leetcode刷题练Python无重复字符的最长子串 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

這是一道字符串處理算法的題目,在日常編程中,處理字符串是常見任務(wù)。該題目會(huì)涉及到一個(gè)概念“滑動(dòng)窗口”。

一、題目描述

給定一個(gè)字符串,請(qǐng)你找出其中不含有重復(fù)字符的?最長(zhǎng)子串?的長(zhǎng)度。

示例?1:

輸入:?"abcabcbb"輸出:?3解釋: 因?yàn)闊o(wú)重復(fù)字符的最長(zhǎng)子串是 "abc",所以其長(zhǎng)度為?3。

示例?2:

輸入:?"bbbbb"輸出:?1解釋:?因?yàn)闊o(wú)重復(fù)字符的最長(zhǎng)子串是 "b",所以其長(zhǎng)度為?1。

示例?3:

輸入:?"pwwkew"輸出:?3解釋:?因?yàn)闊o(wú)重復(fù)字符的最長(zhǎng)子串是?"wke",所以其長(zhǎng)度為?3。? 請(qǐng)注意,你的答案必須是 子串 的長(zhǎng)度,"pwke"?是一個(gè)子序列,不是子串。

二、解題思路

先來(lái)定義一下“子串”,根據(jù)題目描述,“子串”就是字符串中截取某一部分,長(zhǎng)度從1到該字符串的長(zhǎng)度。比如“abc”的子串集合是:

['a', 'b', 'c', 'ab', 'bc', 'abc']

用?Python?生成這個(gè)集合很容易,你是否想到了?

那么問(wèn)題來(lái)了,任意長(zhǎng)度為n的字符串一共有多少個(gè)這樣的“子串”呢?答案是:(n+1)?*?n?/?2?。從上面的例子很容易得出這個(gè)答案:begin等于0時(shí),長(zhǎng)度可以有?n?-?0?個(gè),begin等于1時(shí),長(zhǎng)度可以有?n?-?1個(gè),以此類推,總數(shù)就是:

n + (n-1) + ... + 1 => (n+1)*n / 2

(1)暴力解法

明白了“子串”的概念和獲取方法,自然而然的就得到了最樸素也是最“暴力”的解法:遍歷字符串得到所有“子串”,然后判斷每個(gè)“子串”是否有重復(fù)字符,最終就會(huì)得到無(wú)重復(fù)最長(zhǎng)子串了。

這個(gè)“暴力”算法中,計(jì)算所有子串的時(shí)間復(fù)雜度是?O(n2),而判斷一個(gè)子字符串是否有重復(fù)字符,又要從頭到尾遍歷一遍該字符串,所有最終的時(shí)間復(fù)雜度可以達(dá)到?O(n3)。

這個(gè)解法是不能被接受的,提到它全是因?yàn)榍懊鎸?duì)“子串”的解釋及其數(shù)量計(jì)算,來(lái)練習(xí)Python對(duì)字符串的操作。

(2)滑動(dòng)窗口

“滑動(dòng)窗口”這個(gè)概念在計(jì)算機(jī)算法中非常常見。該算法可以把嵌套的循環(huán)轉(zhuǎn)化為單循環(huán)從而降低時(shí)間復(fù)雜度。它在很多不同的領(lǐng)域都有應(yīng)用:

TCP協(xié)議的滑動(dòng)窗口進(jìn)行流量控制

NLP(自然語(yǔ)言處理)中的 N-gram

圖像處理中的物體識(shí)別

有興趣的同學(xué)可以深入了解上面提到的應(yīng)用領(lǐng)域。

下面我們看看,“滑動(dòng)窗口”如何進(jìn)行字符串處理。結(jié)合題目中的例子“abcabcbb”這個(gè)字符串,我們來(lái)看看如何找它的無(wú)重復(fù)最長(zhǎng)子串。

首先,我們定義窗口的兩端:begin和end,分別表示要找的子串的開頭和結(jié)尾。

開始的時(shí)候,begin和end都指向0的位置即‘a(chǎn)’,然后end不斷后移(窗口變寬),當(dāng)遇到第二個(gè)‘a(chǎn)’時(shí)(遇見重復(fù)字符)就得到一個(gè)子串,其長(zhǎng)度就是end和begin位置的差。

如何判斷是否遇到了重復(fù)字符‘a(chǎn)’呢?需要一個(gè)字典作為輔助數(shù)據(jù)結(jié)構(gòu),把end從頭開始遇到的每個(gè)字符及其索引位置都放到字典里面,end每次移動(dòng)到新字符就查一下字典即可。

通過(guò)字典,我們遇到第二個(gè)‘a(chǎn)’時(shí)就可以找到存在字典里面的第一個(gè)‘a(chǎn)’的位置。為了繼續(xù)尋找無(wú)重復(fù)子串,begin就要指向第一個(gè)‘a(chǎn)’后面一個(gè)的位置即‘b’。然后end繼續(xù)后移到‘b’,有發(fā)現(xiàn)它與前面的‘b’重復(fù),計(jì)算子串長(zhǎng)度賦值給最大長(zhǎng)度(需要比較),同時(shí)begin要移動(dòng)第一個(gè)‘b’后面的位置即‘c’。

這樣依次移動(dòng)end到字符串末尾就可以找到最長(zhǎng)的子串,“子串窗口”也就從頭移到了末尾。而只需要end從頭到尾的一次循環(huán)即可。

把這個(gè)過(guò)程用Python實(shí)現(xiàn)如下:

提交后就可以看到結(jié)果。“執(zhí)行時(shí)間”還只是個(gè)參考,再一次提交相同代碼結(jié)果不是圖中的擊敗91%,而變成了百分之十幾。

Python送書活動(dòng)還在繼續(xù),歡迎參加:

拼手氣送?Python 書籍

一個(gè)十年P(guān)ython碼奴與運(yùn)營(yíng)汪的結(jié)合體

長(zhǎng)按掃碼關(guān)注

總結(jié)

以上是生活随笔為你收集整理的python字符串中最长的连续升序子串_Leetcode刷题练Python无重复字符的最长子串的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。