結尾……還是乙個學生,做題解只是個人記錄,**有不少錯誤或紕漏之處,還望多多包涵。
給定乙個字串,你的任務是計算這個字串中有多少個回文子串。
具有不同開始位置或結束位置的子串,即使是由相同的字元組成,也會被視作不同的子串。
示例 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 ...