131. 分割回文串(力扣LeetCode)

文章目錄

  • 131. 分割回文串
    • 題目描述
    • 回溯代碼

131. 分割回文串

題目描述

給你一個字符串 s,請你將 s 分割成一些子串,使每個子串都是 回文串 。返回 s 所有可能的分割方案。

回文串 是正著讀和反著讀都一樣的字符串。

示例 1:

輸入:s = “aab”
輸出:[[“a”,“a”,“b”],[“aa”,“b”]]

示例 2:

輸入:s = “a”
輸出:[[“a”]]

提示:

  • 1 <= s.length <= 16
  • s 僅由小寫英文字母組成

回溯代碼

在此代碼片段中,子字符串是通過遞歸函數 backtracking 來獲取的。函數 backtracking 是一個回溯算法的實現,用于找到字符串 s 的所有可能的回文分割。回文分割是指將字符串分割成若干子串,使得每個子串都是回文的。

下面是 backtracking 函數在尋找子串時的詳細過程:

  1. 函數 backtracking 接收原始字符串 s 和一個 startIndex 參數,該參數指示當前考慮的子串的起始位置。

  2. 在每一層遞歸中,函數通過循環從 startIndex 遍歷到字符串 s 的末尾。

  3. 在每次迭代中,它通過調用 isPalindrome 函數來檢查當前考慮的子串 s[startIndex, i] 是否是回文。

  4. 如果檢測到子串是回文,使用 substr 方法從 s 中提取出回文子串。substr 方法的第一個參數是子串的起始位置,第二個參數是要提取的字符數。這里,提取的字符數計算為 i - startIndex + 1,表示從 startIndex 到 i(包含 i)的子串長度。

  5. 獲取到的回文子串 str 被加入到臨時路徑 path 中。

  6. 然后,遞歸調用 backtracking 函數,在尋找剩余子串的新的回文分割方案,此時 startIndex 更新為 i + 1,因為 i 位置的字符已經包含在了當前找到的回文子串內。

  7. 遞歸返回后,執行 path.pop_back(),這是回溯的一部分,它將最后一個添加到 path 中的回文子串移除,以便 path 可以用于下一次循環迭代時的新的分割方案。

  8. 當 startIndex 大于或等于字符串 s 的長度時,意味著已經到達字符串的末尾,當前 path 中存儲的回文子串序列即為 s 的一個有效分割,此時將 path 加入到 result 中。

通過這種方法,代碼實現了在遞歸循環中對字符串進行子串的分割,并確保了每個分割方案中的所有子串都是回文的。

假設我們有一個字符串 s = “aab” 并且我們想要找到所有可能的回文分割方案。下面是 backtracking 函數在這個字符串上操作的示例:

  1. 初始調用 backtracking("aab", 0)startIndex 是 0,意味著我們從字符串的第一個字符開始。

  2. 第一層遞歸的循環從 i = 0 開始:

    a. 檢查子串 s[0, 0]"a" 是否是回文 — 是,所以 path 變為 ["a"]

    b. 遞歸調用 backtracking("aab", 1) 查看從第二個字符開始的所有回文分割方案。

  3. 第二層遞歸開始,現在考慮的子串是 "ab"

    a. 循環從 i = 1 開始,檢查子串 s[1, 1]"a" 是否是回文 — 是,所以現在 path 變為 ["a", "a"]

    b. 遞歸調用 backtracking("aab", 2) 查看從第三個字符開始的所有回文分割方案。

  4. 第三層遞歸開始,現在考慮的子串是 "b"

    a. 循環從 i = 2 開始,檢查子串 s[2, 2]"b" 是否是回文 — 是,所以現在 path 變為 ["a", "a", "b"]

    b. 遞歸調用 backtracking("aab", 3),發現 startIndex 等于字符串長度,意味著找到了完整的一組分割方案。將其添加到 result 中,result = [["a", "a", "b"]]

    c. 回溯發生,path.pop_back() 移除最后一個元素 "b",現在 path = ["a", "a"]

  5. 返回到第二層遞歸,繼續 i 的循環,現在 i = 2

    a. 檢查子串 s[1, 2]"ab" 是否是回文 — 不是,所以不改變 path

    b. 循環結束,開始回溯,path.pop_back() 移除最后一個元素 "a",現在 path = ["a"]

  6. 返回到第一層遞歸,繼續 i 的循環,下一次 i = 1

    a. 檢查子串 s[0, 1]"aa" 是否是回文 — 是,所以 path 變為 ["aa"]

    b. 遞歸調用 backtracking("aab", 2) 查看從第三個字符開始的所有回文分割方案。

  7. 第四層遞歸開始,現在考慮的子串是 "b"

    a. 循環從 i = 2 開始,檢查子串 s[2, 2]"b" 是否是回文 — 是,所以 path 變為 ["aa", "b"]

    b. 遞歸調用 backtracking("aab", 3),發現 startIndex 等于字符串長度,意味著找到了另外一個完整的一組分割方案。將其添加到 result 中,現在 result = [["a", "a", "b"], ["aa", "b"]]

  8. 回溯發生,path.pop_back() 移除 "b",回到 path = ["aa"]。然后第四層遞歸的循環結束,path.pop_back() 再次移除 "aa",回到 path = []

最終的 result 包含了所有可能的回文分割方案:[["a", "a", "b"], ["aa", "b"]]。這樣,我們就逐步構建了每一個可能的回文分割方案并將有效的方案添加到結果集中。

在這里插入圖片描述

class Solution {
public:// 主函數,調用回溯函數并返回結果vector<vector<string>> partition(string s) {backstracking(s,0); // 從字符串的第一個字符開始進行回溯return result; // 返回所有可能的分割方案}private:vector<vector<string>> result; // 存儲所有可能的分割方案vector<string> path; // 用于存儲當前的分割方案// 檢查一個子串是否是回文串bool cheak(string& s,int begin,int end) {for(int i=begin,j=end;i<j;i++,j--) // 從兩頭開始向中間檢查if(s[i]!=s[j]) // 如果兩頭字符不相等,則不是回文return false; // 返回 falsereturn true; // 所有字符都相等,返回 true}// 回溯函數void backstracking(string& s,int start) {if(start==s.size()) { // 如果 start 等于字符串的長度,表示已經處理完畢result.push_back(path); // 將當前的分割方案添加到結果中return ; // 返回上一層}// 從 start 開始往后查找可能的分割點for(int i=start;i<s.size();i++) {if(cheak(s,start,i)) { // 檢查從 start 到 i 的子串是否是回文string str=s.substr(start,i-start+1); // 是,將其作為一個分割path.push_back(str); // 將子串添加到當前的分割方案中} else {continue; // 如果不是回文,跳過當前的字符,繼續下一輪循環}backstracking(s,i+1); // 遞歸調用,從下一個字符開始繼續分割剩余的字符串path.pop_back(); // 回溯,移除最后添加的子串,嘗試其他可能的分割點}}
};

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/716131.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/716131.shtml
英文地址,請注明出處:http://en.pswp.cn/news/716131.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android 架構MVI、MVVM、MVC、MVP

目錄 一、MVC&#xff08;Model-View-Controller&#xff09; 二、 MVP&#xff08;Model-View-Presenter&#xff09; 三. MVVM&#xff08;Model-View-ViewModel&#xff09; 四. MVI&#xff08;Model-View-Intent&#xff09; 五.MVI簡單實現 先簡單了解一下MVC、MVP和…

索引使用規則6——單列索引聯合索引

1、單列索引 單列索引&#xff1a;即一個索引只包含單個列 舉個例子 1.1、給phone和那么建立索引 create index index_name on tb_qianzhui(name); create index index_phone on tb_qianzhui(phone);1.2、查詢發現可能的索引有好幾個&#xff0c;但是最終選擇了phone的索引…

軟考 系統分析師系列知識點之詳細調查(2)

接前一篇文章&#xff1a;軟考 系統分析師系列知識點之詳細調查&#xff08;1&#xff09; 所屬章節&#xff1a; 第10章. 系統分析 第2節. 詳細調查 在系統規劃階段&#xff0c;通過初步調查&#xff0c;系統分析師已經對企業的組織結構、系統功能等有了大致的了解。但是&…

蘿卜大雜燴 | 提高數據科學工作效率的 8 個 Python 庫

本文來源公眾號“蘿卜大雜燴”&#xff0c;僅用于學術分享&#xff0c;侵權刪&#xff0c;干貨滿滿。 原文鏈接&#xff1a;提高數據科學工作效率的 8 個 Python 庫 在進行數據科學時&#xff0c;可能會浪費大量時間編碼并等待計算機運行某些東西。所以我選擇了一些 Python 庫…

Vue3中的Hooks詳解

vue3帶來了Composition API&#xff0c;其中Hooks是其重要組成部分。之前我寫過一篇關于vue3 hooks的文章比較簡單 Vue3從入門到刪庫 第十一章&#xff08;自定義hooks&#xff09; 所以本文將深入探討Vue3中Hooks&#xff0c;幫助你在Vue3開發中更加得心應手。 一、Vue3 Hoo…

貪吃蛇(C語言)步驟講解

一&#xff1a;文章大概 使用C語言在windows環境的控制臺中模擬實現經典小游戲 實現基本功能&#xff1a; 1.貪吃蛇地圖繪制 2.蛇吃食物的功能&#xff08;上&#xff0c;下&#xff0c;左&#xff0c;右方向控制蛇的動作&#xff09; 3.蛇撞墻死亡 4.計算得分 5.蛇身加…

[C語言]——C語言常見概念(1)

目錄 一.C語言是什么、 二.C語言的歷史和輝煌 三.編譯器的選擇&#xff08;VS2022為例&#xff09; 1.編譯和鏈接 2.編譯器的對比 3.VS2022 的優缺點 四.VS項目和源文件、頭文件介紹 五.第?個C語言程序 ??????? 一.C語言是什么、 ?和?交流使?的是?然語?&…

【python】爬取鏈家二手房數據做數據分析【附源碼】

一、前言、 在數據分析和挖掘領域中&#xff0c;網絡爬蟲是一種常見的工具&#xff0c;用于從網頁上收集數據。本文將介紹如何使用 Python 編寫簡單的網絡爬蟲程序&#xff0c;從鏈家網上海二手房頁面獲取房屋信息&#xff0c;并將數據保存到 Excel 文件中。 二、效果圖&#…

【JS】解構賦值注意點,解構賦值報錯

報錯代碼 const 小明 { email: 6, pwd: 66 } const 小剛 { email: 9, pwd: 99 }const { email } 小明 const { email } 小剛 報錯圖 原因 2個常量重復&#xff0c;重復在同一個作用域內是不能重復的&#xff0c;例如大括號內{const a 1; const a 2} 小伙伴A提問 問&…

Redis-基礎篇

Redis是一個開源、高性能、內存鍵值存儲數據庫&#xff0c;由 Salvatore Sanfilippo&#xff08;網名antirez&#xff09;創建&#xff0c;并在BSD許可下發布。它不僅可以用作緩存系統來加速數據訪問&#xff0c;還可以作為持久化的主數據存儲系統或消息中間件使用。Redis因其數…

leetcode:37.解數獨

題目理解&#xff1a;本題中棋盤的每一個位置都要放一個數字&#xff08;而N皇后是一行只放一個皇后&#xff09;&#xff0c;并檢查數字是否合法&#xff0c;解數獨的樹形結構要比N皇后更寬更深。 代碼實現&#xff1a;

SpringBoot+Redis 解決海量重復提交問題,yyds!

在實際的開發項目中,一個對外暴露的接口往往會面臨很多次請求&#xff0c;我們來解釋一下冪等的概念&#xff1a;任意多次執行所產生的影響均與一次執行的影響相同。按照這個含義&#xff0c;最終的含義就是 對數據庫的影響只能是一次性的&#xff0c;不能重復處理。如何保證其…

?動類型轉換、強制類型轉換

為何short s1 1;是對的&#xff0c;而float f3.4;是錯的&#xff1f; 整數直接量&#xff0c;默認是int型。所以int a 4L; 會報錯&#xff0c;但是long l 4; 這樣不會&#xff0c;因為這樣會形成一個自動類型的轉換&#xff0c;int類型自動轉換為long類型 小數直接量&#…

JetBrains Gateway Github Copilot 客戶端插件和主機插件

JetBrains Gateway可以通過插件支持Github Copilot&#xff08;需另行注冊&#xff09;。 需要安裝插件 客戶端&#xff0c;而非插件 主機&#xff0c;如圖所示&#xff1a; 大概是因為代碼顯示在客戶端&#xff08;運行在本地的IDE&#xff09;&#xff1f;

NOC2023軟件創意編程(學而思賽道)python初中組復賽真題

目錄 下載打印原文檔做題: 軟件創意編程 一、參賽范圍 1.參賽組別:小學低年級組(1-3 年級)、小學高年級組(4-6 年級)、初中組。 2.參賽人數:1 人。 3.指導教師:1 人(可空缺)。 4.每人限參加 1 個賽項。 組別確定:以地方教育行政主管部門(教委、教育廳、教育局) 認…

Python 潮流周刊#40:白宮建議使用 Python 等內存安全的語言

△△請給“Python貓”加星標 &#xff0c;以免錯過文章推送 你好&#xff0c;我是貓哥。這里每周分享優質的 Python、AI 及通用技術內容&#xff0c;大部分為英文。本周刊開源&#xff0c;歡迎投稿[1]。另有電報頻道[2]作為副刊&#xff0c;補充發布更加豐富的資訊&#xff0c;…

三層靶機靶場之環境搭建

下載&#xff1a; 鏈接&#xff1a;百度網盤 請輸入提取碼 提取碼&#xff1a;f4as 簡介 2019某CTF線下賽真題內網結合WEB攻防題庫&#xff0c;涉 及WEB攻擊&#xff0c;內網代理路由等技術&#xff0c;每臺服務器存在一個 Flag&#xff0c;獲取每一 個Flag對應一個積分&…

在docker中搭建selenium 爬蟲環境(3分鐘快速搭建)

1、安裝docker 省略 2、拉取鏡像 docker pull selenium/standalone-chrome-debug 3、運行容器 docker run -d -p 4444:4444 -p 5900:5900 -v C:\Users\Public\VNC_Donwnloads:/home/seluser/Downloads --memory6g --name selenium_chrome selenium/standalone-chrome-debu…

Vue中commit和dispatch區別及其用法辨析

在Vue中&#xff0c;commit和dispatch是兩個用于觸發 Vuex store 中的 mutations 和 actions 的方法。 區別 commit: 用于觸發 mutations&#xff0c;即直接修改 state 的同步操作。通過commit方法可以調用 store 中的 mutations&#xff0c;并且只能同步地執行。使用方式如下…

大數據核心技術概論

大數據核心技術概述 大數據基石三大論文&#xff1a;GFS&#xff08;Hadoop HDFS&#xff09;、BigTable&#xff08;Apache HBase&#xff09;、MapReduce&#xff08;Hadoop MapReduce&#xff09;。 搜索引擎的核心任務&#xff1a;一是數據采集&#xff0c;也就是網頁的爬…