[LeetCode By Python] 3. Longest Substring Without Repeating Characters

一、題目


Longest Substring Without Repeating Characters.png

二、解題


1)題意

  • 題目的意思還是比較好理解的,輸入一個(gè)字符串,找出沒(méi)有重復(fù)字符的最長(zhǎng)子串,返回其長(zhǎng)度。
    例如abcabcbb,abc為最長(zhǎng)的無(wú)重復(fù)字符的子串,如果是abca或者bcab則出現(xiàn)了重復(fù)了。

2)關(guān)鍵點(diǎn)

  • 子串沒(méi)有重復(fù),即子串里面沒(méi)有重復(fù)的字符。
  • 子串是需要連續(xù)的。

三、思考:


  • 使用遍歷的方式,存儲(chǔ)最長(zhǎng)的字符串長(zhǎng)度在maxlength
  • 使用兩個(gè)下標(biāo)(i、j),i從0開(kāi)始,j從i+1開(kāi)始,在沒(méi)有重復(fù)的情況下,j每次增加1(步長(zhǎng)為1),取出當(dāng)前的標(biāo)記下標(biāo)的子串tempStr(從i到j(luò)、包括j),計(jì)算tempStr長(zhǎng)度并記錄到templength,與maxlength比較,大則賦值。
  • (關(guān)鍵點(diǎn))當(dāng)遇到重復(fù)的時(shí)候:找到重復(fù)的位置,并把i移動(dòng)到此處,j不變,然后循環(huán)繼續(xù)。在python代碼中,使用find是找到的tempStr的下標(biāo),要換成源字符串的下標(biāo)表則需要加上原來(lái)的i的位置。

四、嘗試與結(jié)果

class Solution(object):
    def lengthOfLongestSubstring(self, s):
        if (len(s) <= 1):
            return len(s)

        i = 0
        j = 1
        tempStr = s[0:1]
        templength = 1
        maxlength = 1

        while (True):
            c = s[j]
            if (c in tempStr):
                t = tempStr.find(c) + 1
                i = i + t #新的i的坐標(biāo)

             #當(dāng)下標(biāo)為j時(shí),s[i:j]這個(gè)字串是不包括j的,所以要把j+1(切片不會(huì)越界)
            tempStr = s[i:j+1] 
            templength = len(tempStr)

            if (templength > maxlength):
                maxlength = templength
            j = j + 1

            if (j >= len(s)):
                break

        return maxlength

結(jié)果:AC

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容