精品欧美一区二区三区在线观看 _久久久久国色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一区二区三区四区| 亚洲欧美日韩小说| 国产精品毛片va一区二区三区| 五月天婷婷久久| 国产精品国产三级国产在线观看| 欧美成人伊人久久综合网| av免费播放网址| 黄网站在线播放| av不卡免费在线观看| 国产精品爽黄69天堂a| 精国产品一区二区三区a片| 亚洲人成网站77777在线观看| 在线播放视频一区| 国产偷人视频免费| 国产亚av手机在线观看| 国产精品久久久久久户外露出| 国产视频在线观看一区| 国产乱码精品一区二区| 久久国产精品99国产| 欧美另类极品videosbestfree| 91网站免费视频| 91成人午夜| 欧美日韩不卡一区二区| 人妻有码中文字幕| 国产精品偷拍| 亚洲精品成a人| 一区二区在线中文字幕电影视频| 欧美理论在线观看| 成人黄色大片在线观看| 亚洲一区二区三区毛片| 亚洲一级在线播放| 日韩精品亚洲一区二区三区免费| 91av在线国产| 日本一本高清视频| 欧美激情性爽国产精品17p| 日韩少妇与小伙激情| 一区二区三区伦理片| 亚洲欧洲色图| 日韩久久免费视频| 久久久久麻豆v国产精华液好用吗 在线观看国产免费视频 | 法国空姐在线观看免费| 日韩免费啪啪| 在线视频二区| 欧美精品日本| 久久天堂电影网| 亚洲精品国产精品国自| 国产探花在线精品一区二区| 亚洲久久久久久久久久久| 中文字幕在线播放一区| 国产区精品视频在线观看豆花| 欧美大片顶级少妇| 深夜视频在线观看| 成人福利一区| 亚洲护士老师的毛茸茸最新章节| 精品1卡二卡三卡四卡老狼| xxxx日韩| 日韩精品极品在线观看| 欧美大片免费播放器| 青青草原在线亚洲| 亚洲欧美中文字幕在线一区| 国产熟女一区二区| 欧美在线观看视频一区| 日韩中文有码在线视频| 国产黄在线免费观看| 午夜日韩av| 欧美激情日韩图片| av中文在线播放| 日韩国产欧美三级| 91精品视频网站| 亚洲精品第五页| 99在线精品观看| 奇米精品在线| 国产在线观看a视频| 亚洲资源在线观看| 人妻有码中文字幕| 中文另类视频| 日韩视频在线你懂得| 亚洲国产第一区| 欧洲激情视频| 久久99热精品| 永久免费无码av网站在线观看| 秋霞av亚洲一区二区三| 91久久国产自产拍夜夜嗨| 天堂在线观看av| 亚洲国产精品成人综合 | 99热这里只有精品2| 国偷自产视频一区二区久| 在线视频日韩精品| 久久老司机精品视频| 日一区二区三区| 亚洲一区二区免费在线| 久久精品a一级国产免视看成人| 最新中文字幕一区二区三区| 欧美综合在线播放| 成人综合网站| 日韩电影大片中文字幕| 九九这里只有精品视频| 国产一区二区三区的电影| 成人在线视频福利| 日中文字幕在线| 一区二区三区欧美在线观看| 老司机午夜av| 国产精伦一区二区三区| 色哟哟入口国产精品| 日本学生初尝黑人巨免费视频| 久久机这里只有精品| 久久久一本精品99久久精品66| 久草免费在线| 日本道在线观看一区二区| 久久久久久久久久久久国产精品| 全球成人免费直播| 欧美亚洲在线播放| 亚洲大尺度视频| 国产精品国产三级国产三级人妇 | 成人欧美magnet| 日韩视频免费观看高清在线视频| 黄色片在线观看免费| 亚洲国产日本| 97国产超碰| 毛片在线看网站| 日本韩国欧美三级| 国产精品300页| 激情综合中文娱乐网| 成人免费在线视频网址| 欧美三级理伦电影| 在线观看日韩精品| 四虎国产精品成人免费入口| 国产深夜精品| 国产青春久久久国产毛片| 在线不卡日本v二区707| 欧美一区二区三区在线电影| 女人18毛片毛片毛片毛片区二| 日本欧美加勒比视频| 日本在线免费观看一区| 性xxxxfreexxxxx欧美丶| 亚洲成人久久一区| 99免费在线观看| 成人亚洲一区二区一| 久久www视频| 亚洲91网站| 欧美国产欧美亚洲国产日韩mv天天看完整| 国产精品一区二区三区在线免费观看| 国产精品美女久久久久aⅴ | 成人av在线播放网站| 免费视频爱爱太爽了| 涩涩屋成人免费视频软件| 美女福利视频一区| 精品国产乱码一区二区三| 亚洲另类中文字| 男人的天堂免费| 亚洲午夜在线| 久久狠狠久久综合桃花| 美女福利一区二区三区| 亚洲男人天堂网站| 性高潮视频在线观看| 国产精品高清亚洲| 久久精品一二三四| 影音先锋日韩资源| 久久一区二区三区av| 成人自拍av| 日韩中文在线观看| 国产高清在线观看视频| 亚洲成人av电影在线| 魔女鞋交玉足榨精调教| 首页欧美精品中文字幕| 亚洲一区二区在线免费观看| 成人在线啊v| 性欧美在线看片a免费观看 | 欧美激情在线视频二区| 欧美特黄一级视频| 欧美日韩激情小视频| 色欲狠狠躁天天躁无码中文字幕| 精品一区二区成人精品| 国产欧美久久久久| 久久99国产精品视频| 91精品国产自产在线| 成年人视频免费在线播放| 亚洲精品日韩丝袜精品| 懂色av蜜臀av粉嫩av喷吹| 综合婷婷亚洲小说| 超碰97在线资源站| 久久99久久99| 欧洲黄色一级视频| 国产精品精品| 久久精品一二三区| 亚洲人体在线| 日本高清视频精品| av免费在线免费| 亚洲欧美日韩天堂一区二区| 国产欧美第一页| 欧美性高潮在线| 一级性生活免费视频| 99精品欧美一区| 中文字幕66页| 麻豆久久精品| 人妻激情另类乱人伦人妻| 神马电影久久| 国产精品区一区二区三在线播放| 日韩一区精品| 奇米影视亚洲狠狠色| 国产三区视频在线观看| 亚洲人成网站免费播放| 成人精品在线播放| 欧美日本国产一区| 无码人妻精品一区二区| 亚洲午夜久久久| 欧美激情精品久久久久久免费 | 激情综合网天天干| 亚洲成熟丰满熟妇高潮xxxxx| 欧美欧美天天天天操| 午夜精品美女久久久久av福利| 精品素人av| 成人做爽爽免费视频| 日韩av首页| 欧美性受xxx| 国产www视频在线观看| 精品国产一区av| a天堂中文在线88| 国产婷婷97碰碰久久人人蜜臀 | 国产一区二区三区视频| 天堂中文资源在线| 亚洲第一网站免费视频| av男人天堂网| 日韩一级黄色大片| 国产三级精品在线观看| 欧美亚洲国产怡红院影院| 日韩视频在线观看一区| 欧美日韩国产精品| 日本少妇激情视频| 亚洲国产欧美一区二区三区丁香婷| 一级片一级片一级片| 国产精品另类一区| 成人激情五月天| 中文字幕免费一区| 日本高清黄色片| 亚洲国产精品二十页| 五月天精品在线| 国产精品伦一区| 992在线观看| 亚洲天堂成人在线观看| 26uuu成人网| 亚洲色图20p| 草视频在线观看| 一个色在线综合| 国产午夜精品无码一区二区| 亚洲成人一区二区在线观看| 日韩av综合在线| 欧美午夜精品久久久久久久| 天天干天天色综合| 欧美性大战xxxxx久久久| 中文字幕自拍偷拍| 7777精品伊人久久久大香线蕉完整版 | 国产二区不卡| 麻豆成人入口| 日本a级片久久久| 91综合久久一区二区| 日韩久久在线| 国产精品毛片一区二区在线看| 国产高清精品软男同| 欧美激情91| 浮妇高潮喷白浆视频| 久久久久91| 无尽裸体动漫2d在线观看| 国产乱色国产精品免费视频| 不许穿内裤随时挨c调教h苏绵| 99热在这里有精品免费| 蜜桃传媒一区二区亚洲| 亚洲欧美中日韩| 国产成人精品亚洲男人的天堂| 欧美视频免费在线| 97超碰国产在线| 亚洲福利视频专区| 国产区视频在线播放| 不卡av在线网站| 黄色污网站在线观看| 国产精品爽爽ⅴa在线观看| 欧美久久亚洲| 欧美日韩电影一区二区| 天天天综合网| 久久黄色片视频| 麻豆国产精品777777在线| 久久久久亚洲av成人网人人软件| 久久人人超碰精品| 午夜国产福利一区二区| 欧美性猛交丰臀xxxxx网站| 国产尤物在线观看| 日韩经典第一页| 成人a在线视频免费观看| 91精品国产99久久久久久| 精品视频在线一区二区在线| 痴汉一区二区三区| 欧美精选一区二区三区| 日韩精品视频在线观看视频 | 成人激情视频在线播放| 天天做夜夜做人人爱精品| 久久av秘一区二区三区| 嫩草成人www欧美| 国产大学生av| 综合欧美亚洲日本| 日韩一级在线视频| 亚洲成人av片| 国产在线观看91| 国产精品日韩在线播放| 欧美调教在线| 久久久久久久香蕉| 久久爱www久久做| 一区二区精品免费| 五月天丁香久久| 精品国产va久久久久久久| 视频在线一区二区| 美女100%一区| 久久青青草原一区二区| 好看的日韩av电影| 三级av免费看| 中文字幕一区二区三区在线播放| 欧美超碰在线观看| 精品亚洲va在线va天堂资源站| 成人性生交大片免费看网站| 91视频免费网站| 欧美成人激情| 91香蕉视频污版| 国产亚洲一区字幕| 国产伦精品一区二区三区视频我| 日韩国产激情在线| 末成年女av片一区二区下载| 超碰在线97av| 国产综合久久| av在线天堂网| 亚洲一区二区三区在线播放| 亚洲不卡免费视频| 欧美wwwxxxx| 欧美视频精品全部免费观看| 国产高清免费在线| 国产在线视频不卡二| 国产精品精品软件男同| 欧美精品一二三| 高清全集视频免费在线| 亚洲jizzjizz日本少妇| 欧美福利电影在线观看| 日本网站在线看| 一区二区久久久久| 亚洲第一页在线观看| 欧美激情在线狂野欧美精品| 精品网站aaa| 男人和女人啪啪网站| 99re在线视频这里只有精品| 久久亚洲精品国产| 亚洲乱码国产乱码精品精天堂| 老色鬼在线视频| 欧美精品免费观看二区| 日韩中文欧美在线| 成人信息集中地| 欧美一区国产二区| 丁香花高清在线观看完整版| 精品欧美日韩在线| 欧美亚洲在线| 后入内射无码人妻一区| 91精品国产综合久久精品图片| a级片国产精品自在拍在线播放| 国产精品福利视频| 欧美亚洲免费| 特黄一区二区三区| 日韩欧美一级二级| 女厕盗摄一区二区三区| 午夜精品一区二区三区在线观看| 麻豆精品久久久| 久久精品一区二区三| 日韩精品中文字幕久久臀| 精品123区| 黄网站色视频免费观看| www久久久久| 91激情在线观看| 国内精久久久久久久久久人| 国产亚洲电影| 激情久久综合网| 午夜精品福利视频网站| 国产精品久久久久久久龚玥菲 | 日韩一卡二卡在线| 国产91在线高潮白浆在线观看| 希岛爱理一区二区三区| 日韩精品人妻中文字幕有码| 欧洲国内综合视频| 欧美精品videossex少妇| 欧美日韩在线观看一区| 国产一区二区不卡在线| www.国产一区二区| 欧美超级免费视 在线| 你懂的一区二区三区| 性鲍视频在线观看| 色综合久久综合中文综合网| 操你啦视频在线| 欧美午夜精品理论片a级大开眼界 欧美午夜精品久久久久免费视 | 黄色永久免费网站| 亚洲一区二区三区精品在线| 99视频在线观看地址| 好吊色欧美一区二区三区| 久久精品国产亚洲一区二区三区| 欧美精品二区三区| 美日韩精品视频免费看|