算法題--將字符串劃分為若干個回文最少需要切幾刀

image.png

0. 鏈接

題目鏈接

1. 題目

Given a string s, partition s such that every substring of the partition is a palindrome.

Return the minimum cuts needed for a palindrome partitioning of s.

Example:

Input: "aab"
Output: 1
Explanation: The palindrome partitioning ["aa","b"] could be produced using 1 cut.

2. 思路1: 動態(tài)規(guī)劃

  1. 基本思路是:
  • 先初始化最差情形,即dp[i] = i(i = 0~size-1), 即每個字母都自成一個回文, dp[i]表示從0到i構(gòu)成的字符串劃分為回文最少需要切幾刀
  • 再自i=1開始從左到右依次嘗試以每個字母作為回文的中心點, 對于每個中心點mid, 向左向右盡量擴展到start, end, 每左右各擴展一格, 則更新dp[end] = min(dp[end], 1 + dp[start - 1] if start > 0 else 0), 表示截止到end所需切的最少刀數(shù), 取決于當前是否選擇切這一刀境钟,選擇的依據(jù),就是能否使得dp[end]變小懒鉴,這是典型的動態(tài)規(guī)范思路瓣履,即選擇驯杜,并評價選擇的結(jié)果優(yōu)劣躬拢。
  • 需要注意的是,對于中心點的選擇念秧,有可能是一個淤井,也有可能是2個,比如abba回文就需要拿中間的bb作為中心點,往左往右可擴展方可, 處理方式即start, end = mid - 1, mid, 它擔負的任務與上一步中一樣摊趾,也是要盡量擴展回文長度, 然后盡量縮小dp[end]的值
  • 最終只需要返回dp[size-1]即可
  1. 分析:
  • 過程中需要嘗試以每個字母作為中心點的情形, 所以有一個n次循環(huán), 對于每個中心點, 又要有左右擴展的嘗試, 極端情況下币狠,比如aaaaaa的情形,每次左右擴展, 都可能到邊界, 因此也是一個n次循環(huán), 最終時間復雜度是O(n^2), 空間復雜度是O(n)
  1. 復雜度
  • 時間復雜度 O(n^2)
  • 空間復雜度 O(n)

3. 代碼

# coding:utf8


class Solution:
    def minCut(self, s: str) -> int:
        size = len(s)
        dp = [[False] * size for _ in range(size)]
        min_cut_times = None

        def dfs(s, start, size, dp, cut_times):
            nonlocal min_cut_times
            if start == size:
                if min_cut_times is None or min_cut_times > cut_times - 1:
                    min_cut_times = cut_times - 1
            else:
                for i in range(start, size):
                    if s[i] != s[start]:
                        continue
                    if i - 1 > start + 1 and not dp[i - 1][start + 1]:
                        continue
                    dp[i][start] = True
                    dfs(s, i + 1, size, dp, cut_times + 1)

        dfs(s, 0, size, dp, 0)
        return min_cut_times


def my_test(solution, s):
    print('input: s={}; output: {}'.format(s, solution.minCut(s)))


solution = Solution()
my_test(solution, 'aab')
my_test(solution, 'bb')


輸出結(jié)果

input: s=aab; output: 1
input: s=bb; output: 0

4. 結(jié)果

image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末砾层,一起剝皮案震驚了整個濱河市漩绵,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌肛炮,老刑警劉巖止吐,帶你破解...
    沈念sama閱讀 222,865評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異侨糟,居然都是意外死亡祟印,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評論 3 399
  • 文/潘曉璐 我一進店門粟害,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人颤芬,你說我怎么就攤上這事悲幅。” “怎么了站蝠?”我有些...
    開封第一講書人閱讀 169,631評論 0 364
  • 文/不壞的土叔 我叫張陵汰具,是天一觀的道長。 經(jīng)常有香客問我菱魔,道長留荔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,199評論 1 300
  • 正文 為了忘掉前任澜倦,我火速辦了婚禮聚蝶,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘藻治。我一直安慰自己碘勉,他們只是感情好,可當我...
    茶點故事閱讀 69,196評論 6 398
  • 文/花漫 我一把揭開白布桩卵。 她就那樣靜靜地躺著验靡,像睡著了一般倍宾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上胜嗓,一...
    開封第一講書人閱讀 52,793評論 1 314
  • 那天高职,我揣著相機與錄音,去河邊找鬼辞州。 笑死怔锌,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的孙技。 我是一名探鬼主播产禾,決...
    沈念sama閱讀 41,221評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼牵啦!你這毒婦竟也來了亚情?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,174評論 0 277
  • 序言:老撾萬榮一對情侶失蹤哈雏,失蹤者是張志新(化名)和其女友劉穎楞件,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體裳瘪,經(jīng)...
    沈念sama閱讀 46,699評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡土浸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,770評論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了彭羹。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片黄伊。...
    茶點故事閱讀 40,918評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖派殷,靈堂內(nèi)的尸體忽然破棺而出还最,到底是詐尸還是另有隱情,我是刑警寧澤毡惜,帶...
    沈念sama閱讀 36,573評論 5 351
  • 正文 年R本政府宣布拓轻,位于F島的核電站,受9級特大地震影響经伙,放射性物質(zhì)發(fā)生泄漏扶叉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,255評論 3 336
  • 文/蒙蒙 一帕膜、第九天 我趴在偏房一處隱蔽的房頂上張望枣氧。 院中可真熱鬧,春花似錦垮刹、人聲如沸作瞄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,749評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽宗挥。三九已至乌庶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間契耿,已是汗流浹背瞒大。 一陣腳步聲響...
    開封第一講書人閱讀 33,862評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留搪桂,地道東北人透敌。 一個月前我還...
    沈念sama閱讀 49,364評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像踢械,于是被迫代替她去往敵國和親酗电。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,926評論 2 361