LeetCode第647題 回文子串題解(C )

2021-10-23 13:19:10 字數 2516 閱讀 6641

結尾……還是乙個學生,做題解只是個人記錄,**有不少錯誤或紕漏之處,還望多多包涵。

給定乙個字串,你的任務是計算這個字串中有多少個回文子串。

具有不同開始位置或結束位置的子串,即使是由相同的字元組成,也會被視作不同的子串。

示例 1:

輸入:「abc」

輸出:3

解釋:三個回文子串: 「a」, 「b」, 「c」

示例 2:

輸入:「aaa」

輸出:6

解釋:6個回文子串: 「a」, 「a」, 「a」, 「aa」, 「aa」, 「aaa」

先把任務分成三步。

第一步,把字串s中所有需要檢測的子串儲存下來放入乙個vector中。

第二步,取vector中的資料進行檢測,若符合回文子串的定義,則放入第二個vector中。

第三步,返回第二個vector的大小。

對於第一步,我們需要想清楚,如何才能得到所有需要檢測的子串?

對於符號串"abc",我們可以得到的所有子串為"a",「b」,「c」,「ab」,「bc」,「abc」,這樣看的話,似乎很難從**角度窮舉所有的子串。

別急,我們換個思路來看,可以將子串看成這樣的集合:

"a",「ab」,「abc」,「b」,「bc」,"c"

看出規律來了吧,我們只需要兩個迴圈就可以窮舉所有需要檢測的子串。

來到第二步,如何才能檢測乙個符號串是否是回文子串呢?

這個還是比較簡單的。定義前後兩個索引,分別往中間靠攏,如果兩個索引的值出現不相等的情況,即不是回文子串;否則,直到前索引大於後索引,即表示已經檢測完這個字串了,那麼該子串就是回文子串了。

不多說了,上**:

class

solution

}for

(auto st : vec)

//第二步,逐個檢測是否為回文子串}if

(flag)

}return vec2.

size()

;//第三步,返回回文子串大小}}

;

執行結果:當然是毫無疑問地gg了。

為什麼第一次會失敗?看輸入用例就可以容易地看出,輸入用例太太太太太長了,用兩個vector來儲存,而且還有4個迴圈,肯定非常慢,因此超出時間限制就不足為奇了。

如何改進呢?其實剛開始分開兩步的時候,我把它們分成兩個函式分別呼叫的角度來思考了。如何你把它當成乙個函式,你就很容易發現,根本是不需要兩個vector的,第一步和第二步是可以合併成乙個vector的,亦即是對每乙個子串進行檢測,檢測為回文子串即放入vector,否則直接丟棄

進一步思考,我們真的需要vector嗎?題目並不要求我們儲存得到的回文子串。因此,我們根本不需要vector,只需要每次檢測到是回文子串就令count+1,最後返回count即可。

**如下:

class

solution}if

(flag)}}

return count;}}

;

執行結果:

雖然順利通過了題目,但我們發現,這個方法太笨重了,需要大量的記憶體和時間。我們是否能夠對它做改進呢?

答案是肯定的,認真分析下,我們還有什麼其實是不需要的呢?

答案是子串,既然我們都不需要儲存回文子串,那麼為什麼又要構造乙個新的子串出來呢?

因此,我們可以對在原來的字串索引ij劃定的範圍內,直接建立新的前後索引來檢測其是否為回文子串,而無需建立新的子串

還有什麼是多餘的呢?分析題目我們可以發現,對於單個的字元,它肯定是回文子串,因為它只有它自身,因此,我們根本不需要花費精力去檢測它。

在原本的**中我們可以發現,我們令j = i,得到的第乙個子串是從i到i,亦即是i。因此在改進中,我們可以令j = i+1,跳過第乙個子串i。在最後的返回中,我們令函式返回count加上字串的大小,即包含多少個字元即可。

上**:

class

solution}if

(flag)}}

return count + size;}}

;

執行結果:

這時候,無論是時間還是空間都有了明顯的改善。

還能繼續改進嗎?答案是肯定的,現在程式中的三個迴圈使得程式的時間複雜度比較大,但我目前還想不出有什麼更好的解決辦法。

其實搜搜題解就會發現許多雙100的大佬,看來求學之路還相當的漫長……

回文子串(力扣第647題)

題目 給定乙個字串,你的任務是計算這個字串中有多少個回文子串。具有不同開始位置或結束位置的子串,即使是由相同的字元組成,也會被視作不同的子串。示例輸入 abc 輸出 3 解釋 三個回文子串 a b c 輸入 aaa 輸出 6 解釋 6個回文子串 a a a aa aa aaa 分析 因為求的是回文子...

leetcode題 647 回文子串(中等)

一 題目描述 647.回文子串 中等 給定乙個字串,你的任務是計算這個字串中有多少個回文子串。具有不同開始位置或結束位置的子串,即使是由相同的字元組成,也會被計為是不同的子串。示例 1 輸入 abc 輸出 3 解釋 三個回文子串 a b c 示例 2 輸入 aaa 輸出 6 說明 6個回文子串 a ...

Leetcode 每日一題 647 回文子串

給定乙個字串,你的任務是計算這個字串中有多少個回文子串。具有不同開始位置或結束位置的子串,即使是由相同的字元組成,也會被視作不同的子串。class solution def countsubstrings self,s str int dp false for in range len s for ...