【LeetCode-回溯】分割回文串
阿新 • • 發佈:2020-07-12
題目描述
給定一個字串 s,將 s 分割成一些子串,使每個子串都是迴文串。
返回 s 所有可能的分割方案。
示例:
輸入: "aab"
輸出:
[
["aa","b"],
["a","a","b"]
]
題目連結: https://leetcode-cn.com/problems/palindrome-partitioning/
思路
由於是求所有可能分割情況,所以使用回溯來做。程式碼如下:
class Solution { public: vector<vector<string>> partition(string s) { if(s.empty()) return {}; vector<vector<string>> ans; vector<string> cur; int start = 0; dfs(s, start, cur, ans); return ans; } void dfs(string s, int start, vector<string> cur, vector<vector<string>>& ans){ if(start>=s.size()){ ans.push_back(cur); return; } for(int i=start; i<s.size(); i++){ string sub = s.substr(start, i-start+1); if(judge(sub)){ cur.push_back(sub); dfs(s, i+1, cur, ans); cur.pop_back(); } } } /*判斷s是否是迴文串,是返回true,不是返回false*/ bool judge(string s){ if(s.size()==1) return true; int left = 0; int right = s.size()-1; while(left<right){ if(s[left]!=s[right]) return false; left++; right--; } return true; } };
使用下面的寫法(多加了幾個引用&
)可以將速度提升 4 倍:
class Solution { public: vector<vector<string>> partition(string s) { if(s.empty()) return {}; vector<string> cur; vector<vector<string>> ans; int start = 0; dfs(s, start, cur, ans); return ans; } void dfs(string& s, int start, vector<string>& cur, vector<vector<string>>& ans){ if(start>=s.size()){ ans.push_back(cur); return; } for(int i=start; i<s.size(); i++){ string sub = s.substr(start, i-start+1); if(judge(sub)){ cur.push_back(sub); dfs(s, i+1, cur, ans); cur.pop_back(); } } } /*判斷s是否是迴文串,是返回true,不是返回false*/ bool judge(string& s){ if(s.size()==1) return true; int left = 0; int right = s.size()-1; while(left<right){ if(s[left]!=s[right]) return false; left++; right--; } return true; } };