精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

分割回文串,有點難!

開發 前端
遞歸用來縱向遍歷,for循環用來橫向遍歷,切割線(就是圖中的紅線)切割到字符串的結尾位置,說明找到了一個切割方法。

[[426079]]

切割問題其實是一種組合問題!

分割回文串

力扣題目鏈接:https://leetcode-cn.com/problems/palindrome-partitioning/

給定一個字符串 s,將 s 分割成一些子串,使每個子串都是回文串。

返回 s 所有可能的分割方案。

示例:

輸入: "aab"

輸出: [ ["aa","b"], ["a","a","b"] ]

思路

本題這涉及到兩個關鍵問題:

  1. 切割問題,有不同的切割方式
  2. 判斷回文

相信這里不同的切割方式可以搞懵很多同學了。

這種題目,想用for循環暴力解法,可能都不那么容易寫出來,所以要換一種暴力的方式,就是回溯。

一些同學可能想不清楚 回溯究竟是如何切割字符串呢?

我們來分析一下切割,其實切割問題類似組合問題。

例如對于字符串abcdef:

  • 組合問題:選取一個a之后,在bcdef中再去選取第二個,選取b之后在cdef中在選組第三個.....。
  • 切割問題:切割一個a之后,在bcdef中再去切割第二段,切割b之后在cdef中在切割第三段.....。

感受出來了不?

所以切割問題,也可以抽象為一顆樹形結構,如圖:

分割回文串

遞歸用來縱向遍歷,for循環用來橫向遍歷,切割線(就是圖中的紅線)切割到字符串的結尾位置,說明找到了一個切割方法。

此時可以發現,切割問題的回溯搜索的過程和組合問題的回溯搜索的過程是差不多的。

回溯三部曲

  • 遞歸函數參數

全局變量數組path存放切割后回文的子串,二維數組result存放結果集。(這兩個參數可以放到函數參數里)

本題遞歸函數參數還需要startIndex,因為切割過的地方,不能重復切割,和組合問題也是保持一致的。

在39. 組合總和中我們深入探討了組合問題什么時候需要startIndex,什么時候不需要startIndex。

代碼如下:

  1. vector<vector<string>> result; 
  2. vector<string> path; // 放已經回文的子串 
  3. void backtracking (const string& s, int startIndex) { 
  • 遞歸函數終止條件

分割回文串

從樹形結構的圖中可以看出:切割線切到了字符串最后面,說明找到了一種切割方法,此時就是本層遞歸的終止終止條件。

那么在代碼里什么是切割線呢?

在處理組合問題的時候,遞歸參數需要傳入startIndex,表示下一輪遞歸遍歷的起始位置,這個startIndex就是切割線。

所以終止條件代碼如下:

  1. void backtracking (const string& s, int startIndex) { 
  2.     // 如果起始位置已經大于s的大小,說明已經找到了一組分割方案了 
  3.     if (startIndex >= s.size()) { 
  4.         result.push_back(path); 
  5.         return
  6.     } 
  • 單層搜索的邏輯

來看看在遞歸循環,中如何截取子串呢?

在for (int i = startIndex; i < s.size(); i++)循環中,我們 定義了起始位置startIndex,那么 [startIndex, i] 就是要截取的子串。

首先判斷這個子串是不是回文,如果是回文,就加入在vector path中,path用來記錄切割過的回文子串。

代碼如下:

  1. for (int i = startIndex; i < s.size(); i++) { 
  2.     if (isPalindrome(s, startIndex, i)) { // 是回文子串 
  3.         // 獲取[startIndex,i]在s中的子串 
  4.         string str = s.substr(startIndex, i - startIndex + 1); 
  5.         path.push_back(str); 
  6.     } else {                // 如果不是則直接跳過 
  7.         continue
  8.     } 
  9.     backtracking(s, i + 1); // 尋找i+1為起始位置的子串 
  10.     path.pop_back();        // 回溯過程,彈出本次已經填在的子串 

注意切割過的位置,不能重復切割,所以,backtracking(s, i + 1); 傳入下一層的起始位置為i + 1。

判斷回文子串

最后我們看一下回文子串要如何判斷了,判斷一個字符串是否是回文。

可以使用雙指針法,一個指針從前向后,一個指針從后先前,如果前后指針所指向的元素是相等的,就是回文字符串了。

那么判斷回文的C++代碼如下:

  1. bool isPalindrome(const string& s, int start, int end) { 
  2.     for (int i = start, j = end; i < j; i++, j--) { 
  3.         if (s[i] != s[j]) { 
  4.             return false
  5.         } 
  6.     } 
  7.     return true

如果大家對雙指針法有生疏了,傳送門:雙指針法:總結篇!

此時關鍵代碼已經講解完畢,整體代碼如下(詳細注釋了)

C++整體代碼

根據Carl給出的回溯算法模板:

  1. void backtracking(參數) { 
  2.     if (終止條件) { 
  3.         存放結果; 
  4.         return
  5.     } 
  6.  
  7.     for (選擇:本層集合中元素(樹中節點孩子的數量就是集合的大小)) { 
  8.         處理節點; 
  9.         backtracking(路徑,選擇列表); // 遞歸 
  10.         回溯,撤銷處理結果 
  11.     } 

不難寫出如下代碼:

  1. class Solution { 
  2. private: 
  3.     vector<vector<string>> result; 
  4.     vector<string> path; // 放已經回文的子串 
  5.     void backtracking (const string& s, int startIndex) { 
  6.         // 如果起始位置已經大于s的大小,說明已經找到了一組分割方案了 
  7.         if (startIndex >= s.size()) { 
  8.             result.push_back(path); 
  9.             return
  10.         } 
  11.         for (int i = startIndex; i < s.size(); i++) { 
  12.             if (isPalindrome(s, startIndex, i)) {   // 是回文子串 
  13.                 // 獲取[startIndex,i]在s中的子串 
  14.                 string str = s.substr(startIndex, i - startIndex + 1); 
  15.                 path.push_back(str); 
  16.             } else {                                // 不是回文,跳過 
  17.                 continue
  18.             } 
  19.             backtracking(s, i + 1); // 尋找i+1為起始位置的子串 
  20.             path.pop_back(); // 回溯過程,彈出本次已經填在的子串 
  21.         } 
  22.     } 
  23.     bool isPalindrome(const string& s, int start, int end) { 
  24.         for (int i = start, j = end; i < j; i++, j--) { 
  25.             if (s[i] != s[j]) { 
  26.                 return false
  27.             } 
  28.         } 
  29.         return true
  30.     } 
  31. public
  32.     vector<vector<string>> partition(string s) { 
  33.         result.clear(); 
  34.         path.clear(); 
  35.         backtracking(s, 0); 
  36.         return result; 
  37.     } 
  38. }; 

總結

這道題目在leetcode上是中等,但可以說是hard的題目了,但是代碼其實就是按照模板的樣子來的。

那么難究竟難在什么地方呢?

我列出如下幾個難點:

  • 切割問題可以抽象為組合問題
  • 如何模擬那些切割線
  • 切割問題中遞歸如何終止
  • 在遞歸循環中如何截取子串
  • 如何判斷回文

我們平時在做難題的時候,總結出來難究竟難在哪里也是一種需要鍛煉的能力。

一些同學可能遇到題目比較難,但是不知道題目難在哪里,反正就是很難。其實這樣還是思維不夠清晰,這種總結的能力需要多接觸多鍛煉。

本題我相信很多同學主要卡在了第一個難點上:就是不知道如何切割,甚至知道要用回溯法,也不知道如何用。也就是沒有體會到按照求組合問題的套路就可以解決切割。

如果意識到這一點,算是重大突破了。接下來就可以對著模板照葫蘆畫瓢。

但接下來如何模擬切割線,如何終止,如何截取子串,其實都不好想,最后判斷回文算是最簡單的了。

關于模擬切割線,其實就是index是上一層已經確定了的分割線,i是這一層試圖尋找的新分割線

除了這些難點,本題還有細節,例如:切割過的地方不能重復切割所以遞歸函數需要傳入i + 1。

所以本題應該是一個道hard題目了。

可能刷過這道題目的錄友都沒感受到自己原來克服了這么多難點,就把這道題目AC了,這應該叫做無招勝有招,人碼合一,哈哈哈。

本文轉載自微信公眾號「代碼隨想錄」,可以通過以下二維碼關注。轉載本文請聯系代碼隨想錄公眾號。

 

責任編輯:武曉燕 來源: 代碼隨想錄
相關推薦

2021-11-12 09:44:03

字符串算法復雜度

2014-04-03 09:36:22

iPad版Office高效辦公

2021-06-07 05:32:53

Webpack Chunk 前端

2019-12-18 16:02:24

AI人工智能

2020-02-07 17:14:44

手機小米手機行業

2010-11-26 10:43:48

MySQL分割字符串

2009-08-07 14:15:21

C#字符串分割

2010-11-26 13:27:41

MySQL存儲過程

2023-07-07 08:24:07

css顏色變量

2021-09-01 07:59:44

HTTPweb瀏覽器

2021-09-07 06:40:25

貪心平衡字符串

2020-11-03 18:36:37

面試字符串算法

2009-12-01 09:18:50

PHP分割字符串

2010-10-09 11:43:10

MYSQL字符串

2022-12-06 08:27:50

Bash腳本字符串

2023-02-26 00:00:02

字符串分割String

2021-03-08 08:23:24

Java字符串截取

2020-02-04 18:06:28

千年一遇對稱日回文算法

2023-12-15 09:49:54

回溯解決組合問題數組

2021-10-09 07:10:32

遞增子序列回溯法
點贊
收藏

51CTO技術棧公眾號

每日更新成人在线视频| 久久av网站| 国产精品网站在线观看| 亚洲xxxx3d| 国产精品白浆一区二小说| 天堂综合网久久| 欧美日韩国产一区二区三区地区| 国内自拍中文字幕| 少妇激情av一区二区| 久久精品国产一区二区三区免费看 | 伊色综合久久之综合久久| 精品久久久国产精品999| 一区二区在线中文字幕电影视频| 人妻丰满熟妇av无码区hd| 日本一不卡视频| 性欧美长视频免费观看不卡| 日本猛少妇色xxxxx免费网站| 北条麻妃在线一区二区免费播放| 欧美性猛交xxxx黑人交| 久久成人免费观看| 91三级在线| 国产日产欧美一区| 国产精选一区二区| 99热精品在线播放| 免费在线成人网| 国产91精品视频在线观看| 亚洲精品久久久久久国| 精品中文一区| 亚洲国产精品成人va在线观看| 亚洲天堂2018av| 国产不卡网站| 欧美日韩性视频在线| 成人免费a级片| 黄色网在线播放| 国产欧美精品一区aⅴ影院| 九色91视频| 日本黄色一区二区三区| 国产黄色成人av| 91久久在线视频| 亚洲天堂国产精品| 日韩一区精品视频| 国产精品99久久久久久人 | 国产成人精品一区二区三区福利| 在线观看不卡的av| 石原莉奈在线亚洲二区| 欧美诱惑福利视频| 亚洲日本视频在线观看| 99视频在线精品国自产拍免费观看| 精品自在线视频| 青青草原在线免费观看视频| 亚洲欧美综合国产精品一区| 另类视频在线观看| 四虎永久免费在线| 在线一区电影| 欧美放荡办公室videos4k| 久久久久久久久久久久久女过产乱| 久久国产精品成人免费观看的软件| 国产亚洲精品久久久优势| 国产又粗又猛又爽视频| 欧美裸体在线版观看完整版| 中国china体内裑精亚洲片| 成人做爰69片免网站| 日本一二区不卡| 久久高清视频免费| 欧美成欧美va| 一区二区三区福利| 欧美中文字幕第一页| 天天射天天干天天| 另类中文字幕网| 2020国产精品久久精品不卡| 亚洲免费不卡视频| 91蝌蚪porny| 先锋影音日韩| caopon在线免费视频| 亚洲图片自拍偷拍| 日本成年人网址| 国产精品美女午夜爽爽| 51精品国自产在线| 欧美大喷水吹潮合集在线观看| 亚洲精品国产setv| 色偷偷av一区二区三区| 欧美成人一区二区三区高清| 亚洲综合另类| 国产精品一二区| 老牛影视av牛牛影视av| 久久精品人人做人人综合 | 精品国产免费久久久久久尖叫| 麻豆app在线观看| 中文字幕五月欧美| 2018日日夜夜| 国产成+人+综合+亚洲欧美| 欧美成人精品福利| 日本免费www| 一区免费在线| 国产日韩欧美在线看| 国产 欧美 精品| 中文字幕精品—区二区四季| 日韩欧美一级在线| 精品国模一区二区三区| 日韩欧美一区中文| 9.1片黄在线观看| 亚洲天堂男人| 国产日韩亚洲欧美| 无码精品视频一区二区三区| 日韩理论在线观看| 精品国产免费av| 国内精品视频| 一区二区三区 在线观看视| 久久精品免费在线| 国产尤物一区二区| 日韩av不卡播放| av漫画网站在线观看| 在线观看91av| av电影在线不卡| 亚洲人www| 99久久久久国产精品免费| 成人在线免费观看| 午夜久久福利影院| 国产91在线免费观看| 成人高清电影网站| 欧美洲成人男女午夜视频| 成人1区2区3区| 最新不卡av在线| 三级a在线观看| 色天下一区二区三区| 欧美精品www| 性一交一乱一透一a级| 国产精品网站在线观看| www.色就是色| 国产99精品| 国产91精品黑色丝袜高跟鞋| 天堂在线视频观看| 亚洲一二三区在线观看| 中文字幕1234区| 午夜精品视频一区二区三区在线看| 国产成人久久久精品一区| 三级在线观看网站| 亚洲国产视频直播| 99久久久无码国产精品性波多| 欧美在线1区| 成人亚洲欧美一区二区三区| 在线视频二区| 欧美日韩免费观看一区三区| 国产午夜福利一区| 免费国产亚洲视频| 亚洲视频导航| 色999久久久精品人人澡69| 这里只有精品丝袜| 亚洲天堂中文在线| 中文字幕一区二区三区在线观看 | 久久伊人影院| 欧美精品中文字幕一区| 国产成人精品毛片| 洋洋av久久久久久久一区| 俄罗斯女人裸体性做爰| 国产精品a久久久久| 国产精品久久久久av福利动漫| 国产精品探花在线| 亚洲国产精品中文| 精品国产一区二区三区四| 久久久综合网站| 91人人澡人人爽人人精品| 日韩精品欧美| 97超级碰碰| 福利影院在线看| 亚洲免费av片| 伊人成人在线观看| 亚洲色图第一区| 熟妇高潮一区二区| 久久人人精品| 一区二区精品在线| 日韩一区二区三区高清在线观看| 欧美精品videos| 可以在线观看的黄色| 欧美群妇大交群中文字幕| 毛片aaaaa| 久久久久久久久久看片| 国产无遮挡猛进猛出免费软件 | 日韩大片在线免费观看| 日韩免费在线免费观看| 亚洲免费视频一区二区三区| 精品久久国产97色综合| 中文字幕免费观看| 亚洲少妇30p| 中文字幕免费在线播放| 青青草原综合久久大伊人精品优势 | 999国产精品999久久久久久| 国产精品手机视频| 午夜精品成人av| 免费91麻豆精品国产自产在线观看 | 亚洲va中文在线播放免费| 久久精品福利视频| 日本韩国在线观看| 欧美精品色综合| 99久热在线精品996热是什么| 国产精品免费免费| 91视频啊啊啊| 国产在线视频一区二区三区| 日韩少妇内射免费播放| 亚洲国产精品成人| 欧美日韩一区二区三区在线视频| 欧美9999| 国产精品影院在线观看| 黄视频免费在线看| 欧美大成色www永久网站婷| 久久久久久久久亚洲精品| 欧美一级黄色录像| 中文有码在线播放| 都市激情亚洲色图| 欧美一区二区三区精品电影| 国产成人在线观看网站| 自拍偷拍国产亚洲| 久久婷婷五月综合| av在线不卡免费看| 亚洲热在线视频| 免费精品99久久国产综合精品| 和岳每晚弄的高潮嗷嗷叫视频| 91一区二区| 色一情一乱一伦一区二区三区| 国偷自产av一区二区三区| 91免费视频国产| 国产福利亚洲| 国产经典一区二区| 亚洲美女尤物影院| 97国产精品视频| 色婷婷av在线| 欧美成人免费va影院高清| 欧美一级二级三级区| 亚洲无亚洲人成网站77777| 四虎在线视频免费观看| 欧美变态口味重另类| 国产伦子伦对白视频| 欧美丰满少妇xxxbbb| 国产精品51麻豆cm传媒| 欧美亚洲动漫精品| 天天干天天操天天操| 在线看一区二区| 免费看毛片网站| 一本大道久久a久久精品综合| 日韩欧美国产亚洲| 亚洲高清免费在线| 国产无遮挡裸体免费视频| 亚洲最色的网站| 国产一级淫片免费| 黄色精品一区二区| 男人日女人网站| 一本到一区二区三区| 中文字幕在线欧美| 欧美午夜精品电影| 中文字幕免费观看视频| 欧美日韩国产一级片| 国产精品无码免费播放| 欧美一级生活片| 亚洲AV午夜精品| 亚洲国产精品电影| 亚洲区小说区图片区| 亚洲欧美国产精品| h视频在线播放| 久久国产一区二区三区| 最新av在线播放| 国a精品视频大全| 亚洲精品中文字幕| 国产精品吴梦梦| 精品国产一区二区三区性色av | 美女喷白浆视频| 日本sm残虐另类| 日本77777| 成人午夜视频网站| 亚洲av片不卡无码久久| 国产精品私人影院| 天天操天天操天天操天天操天天操| 一区二区国产盗摄色噜噜| 国产对白videos麻豆高潮| 欧美性69xxxx肥| 91麻豆国产视频| 精品国产一区久久| 韩国福利在线| 美女少妇精品视频| 亚洲风情在线资源| 91免费看片在线| 啪啪国产精品| 免费在线观看污污视频| 狠狠久久婷婷| 污视频网站观看| 99精品一区二区三区| 国产三级短视频| 洋洋成人永久网站入口| 91午夜精品亚洲一区二区三区| 91精品欧美一区二区三区综合在| 日本黄视频在线观看| 日韩中文视频免费在线观看| 青草青在线视频| 国产精品视频精品| 日本一区二区三区视频在线看| 久久综合一区| 欧美激情1区2区| 人妻少妇被粗大爽9797pw| 国产资源在线一区| 中日韩精品一区二区三区| 亚洲少妇最新在线视频| 黄色片中文字幕| 亚洲丁香久久久| 蜜芽在线免费观看| 国产97在线|亚洲| 91精品国产自产精品男人的天堂| 日韩欧美一区二区在线观看| 亚洲国产片色| 免费高清视频在线观看| 中文子幕无线码一区tr| 全部毛片永久免费看| 日韩美女视频在线| 在线免费观看黄色网址| 日本免费一区二区三区视频观看 | 欧美日韩在线一区二区三区| 狠狠爱成人网| 无码国产精品一区二区高潮| 国产精品嫩草久久久久| 伦av综合一区| 日韩精品久久久久| 在线观看男女av免费网址| 国产精品日韩专区| 亚洲人成网亚洲欧洲无码| 成人精品视频在线播放| 国产激情91久久精品导航| 日韩精品一区二区亚洲av性色| 欧美在线视频你懂得| 九色在线免费| 欧洲午夜精品久久久| 开心激情综合| 黄色一级片在线看| 国产999精品久久久久久绿帽| 熟女少妇a性色生活片毛片| 欧美午夜精品电影| 幼a在线观看| 国产精品无码专区在线观看| 欧美亚洲精品在线| 已婚少妇美妙人妻系列| 久久久久久久综合色一本| 亚洲免费在线观看av| 日韩精品免费视频| 色是在线视频| 欧美人与性禽动交精品| 日韩高清电影一区| 九一在线免费观看| 欧美日韩国产精品自在自线| 欧美13一16娇小xxxx| 国产在线视频不卡| 91精品精品| 超碰人人cao| 亚洲成av人片| 全部免费毛片在线播放网站| 国产成人aa精品一区在线播放| 夜色77av精品影院| 国产麻花豆剧传媒精品mv在线| 久久这里只有精品视频网| 日韩欧美在线观看免费| 自拍偷拍免费精品| 国产精品高清一区二区| 欧美在线观看视频免费| a美女胸又www黄视频久久| 九九热在线免费观看| 国产香蕉97碰碰久久人人| 成人黄色视屏网站| 色一情一乱一乱一区91| 成人一区二区三区| 国产精品视频免费播放| 国产亚洲精品久久久| **国产精品| 一本久道高清无码视频| 久久久久久久免费视频了| 在线观看国产成人| 欧美黑人视频一区| 久操国产精品| 亚洲制服中文字幕| 亚洲国产精品一区二区久久恐怖片 | 日韩欧美中文字幕一区二区| 亚洲女同精品视频| 欧美视频精品| 免费无码毛片一区二三区| 久久精品视频免费| a网站在线观看| 91精品国产99久久久久久| 成人在线一区| 免费黄色a级片| 在线观看视频一区二区| 天堂亚洲精品| 色视频一区二区三区| 国产成人三级在线观看| 国产一卡二卡三卡| 欧美国产一区二区三区| 国产探花一区在线观看| 亚洲精品鲁一鲁一区二区三区 | 精品人妻一区二区三区换脸明星| 97免费中文视频在线观看| 97人人精品| 性欧美成人播放77777| 欧美一区二区三区在线观看 | 精品视频在线观看| 国产一区在线观看麻豆| 人人草在线观看|