Leetcode 131 分割回文串(純DFS)

131. 分割回文串https://leetcode.cn/problems/palindrome-partitioning/https://leetcode.cn/problems/palindrome-partitioning/

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

示例 1:

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

示例 2:

輸入:s = "a"
輸出:[["a"]]

提示:

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

DFS方案1:初始化一個代表分割點的01數組,然后對這個數組的狀態使用dfs搜索。這個方案耗時長,空間復雜度也不小。具體代碼如下:

class Solution {
public:vector<vector<string>> ans;bool cutoff[20] = {false};//代表分割點的01數組bool check(string s)//判斷回文串{string ss = s;reverse(s.begin(),s.end());if(ss==s)return true;else return false;}void dfs(string s,int cur)//枚舉每一個位置,有在該點分割與不分割兩種情況{if(cur == s.size()){vector<string> temp;int i = 0;while(true){string t;t.push_back(s[i]);i++;while(!cutoff[i]){t.push_back(s[i]);i++;}if(!check(t))return;else temp.push_back(t);if (i >= s.size())break;}ans.push_back(temp);return;}cutoff[cur] = true;dfs(s,cur+1);cutoff[cur] = false;dfs(s,cur+1);}vector<vector<string>> partition(string s) {//為了整體代碼和諧,將首尾都設為分割cutoff[0] = true;cutoff[s.size()] = true;dfs(s,1);return ans;}
};

DFS方案2:從前到后直接枚舉分割點。如下圖:

這個方案更快些,具體差別在該方案能及時排除不可能選項,而不是等上一個方案把所有可能情況全列出來然后對每個依次排除。代碼具體如下:

class Solution {
public:vector<vector<string>> ans;vector<string> temp;bool check(string s){string ss = s;reverse(s.begin(),s.end());if(ss==s)return true;else return false;}void dfs(int startindex,const string s)//前者代表起始點{if(startindex==s.size()){ans.push_back(temp);return;}for(int i = startindex;i<s.size();++i){string str = s.substr(startindex,i-startindex + 1);if(check(str)){temp.push_back(str);dfs(i+1,s);temp.pop_back();}else continue;}}vector<vector<string>> partition(string s) {dfs(0,s);return ans;}
};

順便說一道幾乎一樣的題:

93. 復原 IP 地址https://leetcode.cn/problems/restore-ip-addresses/

有效 IP 地址?正好由四個整數(每個整數位于?0?到?255?之間組成,且不能含有前導?0),整數之間用?'.'?分隔。

  • 例如:"0.1.2.201"?和 "192.168.1.1"?是?有效?IP 地址,但是?"0.011.255.245""192.168.1.312"?和?"192.168@1.1"?是?無效?IP 地址。

給定一個只包含數字的字符串?s?,用以表示一個 IP 地址,返回所有可能的有效 IP 地址,這些地址可以通過在?s?中插入?'.'?來形成。你?不能?重新排序或刪除?s?中的任何數字。你可以按?任何?順序返回答案。

示例 1:

輸入:s = "25525511135"
輸出:["255.255.11.135","255.255.111.35"]

示例 2:

輸入:s = "0000"
輸出:["0.0.0.0"]

示例 3:

輸入:s = "101023"
輸出:["1.0.10.23","1.0.102.3","10.1.0.23","10.10.2.3","101.0.2.3"]

提示:

  • 1 <= s.length <= 20
  • s?僅由數字組成

思路幾乎一致,都是要求分割的字符串所有情況,唯一不同的是這道題有些額外的條件,但都很好解決,具體代碼如下:

class Solution {
public:vector<string> ans;vector<string> temp;inline int transform(string s)//字符串轉數字{int t = 0;int re = 0;for(int i = s.size()-1;i>=0;i--,t++){re+=(s[i] - '0')*pow(10,t);}return re;}bool check(string s){string ss = s;reverse(s.begin(),s.end());if(ss==s)return true;else return false;}void dfs(int startindex,const string s)//前者代表起始點{if(temp.size()>4)//很明顯的剪枝return;if(startindex==s.size()&&temp.size()==4){string str;for(int i = 0;i<temp.size();++i){for(int j = 0;j<temp[i].size();++j){str.push_back(temp[i][j]);}str.push_back('.');}str.pop_back();ans.push_back(str);return;}for(int i = startindex;i<s.size();++i){string str = s.substr(startindex,i-startindex + 1);if((str.size()>=2&&str[0] == '0')||str.size()>3||transform(str)>255)//由題得出的篩選條件continue;temp.push_back(str);dfs(i+1,s);temp.pop_back();}}vector<string> restoreIpAddresses(string s) {dfs(0,s);return ans;}
};

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

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

相關文章

電梯系統的UML文檔14

對于 HallButtonControl&#xff0c;我們有二個狀態: "門廳燈開 " 和 " 門廳燈關"。 從給出的初始信息&#xff0c;初始的狀態應該是"門廳燈關"。行為定義&#xff1a; " 當 HallCall[f&#xff0c;d]是真&#xff0c;則指令 HallLight[f&…

關于安卓greendao打包時報錯問題修復

背景 項目在使用greendao的時候&#xff0c;debug安裝沒有問題&#xff0c;一到打包簽名就報了。 環境 win10 jdk17 gradle8 項目依賴情況 博主的greendao是一個獨立的module項目&#xff0c;項目目前只適配了java&#xff0c;不支持Kotlin。然后被外部集成。greendao版本…

SQL server 數據庫使用整理

標題&#xff1a;SQL server 數據庫使用整理 1.字符串表名多次查詢 2.讀取SQL中Json字段中的值&#xff1a;JSON_VALUE&#xff08;最新版本支持&#xff0c;屬性名大小寫敏感&#xff09; 1.字符串表名多次查詢 SELECT ROW_NUMBER() OVER (ORDER BY value ASC) rowid,value…

一文講解Java中的BIO、NIO、AIO之間的區別

BIO、NIO、AIO是Java中常見的三種IO模型 BIO&#xff1a;采用阻塞式I/O模型&#xff0c;線程在執行I/O操作時被阻塞&#xff0c;無法處理其他任務&#xff0c;適用于連接數比較少的場景&#xff1b;NIO&#xff1a;采用非阻塞 I/O 模型&#xff0c;線程在等待 I/O 時可執行其…

分布式系統架構怎么搭建?

分布式系統架構 互聯網企業的業務飛速發展&#xff0c;促使系統架構不斷變化。總體來說&#xff0c;系統架構大致經歷了單體應用架構—垂直應用架構—分布式架構—SOA架構—微服務架構的演變&#xff0c;很多互聯網企業的系統架構已經向服務化網格&#xff08;Service Mesh&am…

Effective C++ 規則50:了解 new 和 delete 的合理替換時機

1、背景 在 C 中&#xff0c;new 和 delete 是動態分配內存的核心操作符。然而&#xff0c;直接使用它們有時會增加程序的復雜性&#xff0c;甚至導致內存泄漏和其他問題。因此&#xff0c;了解何時替換 new 和 delete 并選擇更適合的內存管理策略&#xff0c;是編寫高效、健壯…

Effective Python:(10)

Effective Python提供90條新穎的Python3編程技巧&#xff0c;可以讓我們寫程序更加靈活&#xff0c;代碼更加整潔而易于維護&#xff0c;這對于商業化系統代碼的重要性不言而喻。 前面兩條主要介紹切片的實用好玩的用法&#xff0c;這一條里反而建議不用切片&#xff0c;這是什…

高效學習方法分享

高效學習方法分享 引言 在信息高速發展的今天&#xff0c;學習已經成為每個人不可或缺的一部分。你是否曾感到學習的疲憊&#xff0c;信息的爆炸讓你無從下手&#xff1f;今天&#xff0c;我們將探討幾種高效的學習方法&#xff0c;幫助你從中找到適合自己的學習之道。關于學…

數據庫備份、主從、集群等配置

數據庫備份、主從、集群等配置 1 MySQL1.1 docker安裝MySQL1.2 主從復制1.2.1 主節點配置1.2.2 從節點配置1.2.3 創建用于主從同步的用戶1.2.4 開啟主從同步1.2.4 主從同步驗證 1.3 主從切換1.3.1 主節點設置只讀&#xff08;在192.168.1.151上操作&#xff09;1.3.2 檢查主從數…

代碼隨想錄_棧與隊列

棧與隊列 232.用棧實現隊列 232. 用棧實現隊列 使用棧實現隊列的下列操作&#xff1a; push(x) – 將一個元素放入隊列的尾部。 pop() – 從隊列首部移除元素。 peek() – 返回隊列首部的元素。 empty() – 返回隊列是否為空。 思路: 定義兩個棧: 入隊棧, 出隊棧, 控制出入…

AJAX綜合案例——圖書管理

黑馬程序員視頻地址&#xff1a; AJAX-Day02-10.案例_圖書管理AJAX-Day02-10.案例_圖書管理_總結_V1.0是黑馬程序員前端AJAX入門到實戰全套教程&#xff0c;包含學前端框架必會的&#xff08;ajaxnode.jswebpackgit&#xff09;&#xff0c;一套全覆蓋的第25集視頻&#xff0c…

【編譯原理實驗二】——自動機實驗:NFA轉DFA并最小化

本篇適用于ZZU的編譯原理課程實驗二——自動機實驗&#xff1a;NFA轉DFA并最小化&#xff0c;包含了實驗代碼和實驗報告的內容&#xff0c;讀者可根據需要參考完成自己的程序設計。 如果是ZZU的學弟學妹看到這篇&#xff0c;那么恭喜你&#xff0c;你來對地方啦&#xff01; 如…

【redis進階】分布式鎖

目錄 一、什么是分布式鎖 二、分布式鎖的基礎實現 三、引入過期時間 四、引入校驗 id 五、引入lua 六、引入 watch dog (看門狗) 七、引入 Redlock 算法 八、其他功能 redis學習&#x1f973; 一、什么是分布式鎖 在一個分布式的系統中&#xff0c;也會涉及到多個節點訪問同一…

wordpress每隔24小時 隨機推薦一個指定分類下的置頂內容。

在WordPress中實現每隔24小時隨機推薦一個指定分類下的置頂內容&#xff0c;可以通過以下步驟實現&#xff1a; 1. 創建自定義函數 在主題的functions.php文件中添加以下代碼&#xff0c;用于創建一個定時任務&#xff0c;每隔24小時隨機選擇一個置頂文章并存儲到選項中&…

Blazor-@bind

數據綁定 帶有 value屬性的標記都可以使用bind 綁定&#xff0c;<div>、<span>等非輸入標記&#xff0c;無法使用bind 指令的&#xff0c;默認綁定了 onchange 事件&#xff0c;onchange 事件是指在輸入框中輸入內容之后&#xff0c;當失去焦點時執行。 page &qu…

RK3568 opencv播放視頻

文章目錄 一、opencv相關視頻播放類1. cv::VideoCapture 類主要構造方法&#xff1a;主要方法&#xff1a; 2. 視頻播放基本流程代碼示例&#xff1a; 3. 獲取和設置視頻屬性4. 結合 FFmpeg 使用5. OpenCV 視頻播放的局限性6. 結合 Qt 實現更高級的視頻播放總結 二、QT中的代碼…

pytorch邏輯回歸實現垃圾郵件檢測

完整代碼&#xff1a; import torch import torch.nn as nn import torch.optim as optim from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score import numpy as…

【 CVE-2025-21298】 通過ghidriff查看完整補丁差異

ole32_dec24.dll-ole32.dll 差異 目錄 視覺圖表差異元數據 Ghidra 差異引擎 命令行二進制元數據差異程序選項

洛谷P3383 【模板】線性篩素數

題目鏈接&#xff1a;P3383 【模板】線性篩素數 - 洛谷 | 計算機科學教育新生態 題目難度&#xff1a;普及一 題目分析&#xff1a;本題是模板題&#xff0c;用到了線性篩法&#xff0c;其中原理是保證范圍內的每個合數都被刪掉&#xff08;在 bool 數組里面標記為非素數…

STM32標準庫移植RT-Thread nano

STM32標準庫移植RT-Thread Nano 嗶哩嗶哩教程鏈接&#xff1a;STM32F1標準庫移植RT_Thread Nano 移植前的準備 stm32標準庫的裸機代碼&#xff08;最好帶有點燈和串口&#xff09;RT-Thread Nano Pack自己的開發板 移植前的說明 本人是在讀學生&#xff0c;正在學習階段&a…