【JDBC】學習路徑10-c3p0資料來源的使用(JDBC完結)
阿新 • • 發佈:2022-05-25
131. 分割回文串
給你一個字串 s
,請你將 s
分割成一些子串,使每個子串都是 迴文串 。返回 s
所有可能的分割方案。
迴文串 是正著讀和反著讀都一樣的字串。
示例 1:
輸入:s = "aab"
輸出:[["a","a","b"],["aa","b"]]
示例 2:
輸入:s = "a"
輸出:[["a"]]
提示:
1 <= s.length <= 16
-
s
僅由小寫英文字母組成
思路:
使用回溯+備忘錄。對於一個字串s,將它分為兩部分,第一部分為迴文,然後把第二部分字串進行同樣的處理,直到字串s遍歷完。
由於需要判斷s中i到j是否是迴文,所以會出現重複計算,使用備忘錄記錄。
class Solution { public: vector<vector<string>>ans; vector<string>res; vector<vector<int>>memo;//備忘錄 vector<vector<string>> partition(string s) { memo.resize(s.size(),vector<int>(s.size(),-1)); part(s,0,s.size()); return ans; } void part(string s,int start,int end){ //base case if(start>end)return; if(start==end){ ans.push_back(res); return; } for(int i=start;i<end;i++){ if(isPart(s,start,i)){//判斷start到i是否是迴文 如果是就對下一部分進行處理 string temp=""; for(int j=start;j<=i;j++)temp+=s[j]; res.push_back(temp); part(s,i+1,end);//對i+1到end進行處理 res.pop_back(); } } } bool isPart(string s,int start,int end){ if(memo[start][end]!=-1)return memo[start][end]; int li=start; int ri=end; bool sig=true; while(li<=ri){ if(s[li]!=s[ri])sig=false; li++;ri--; } memo[start][end]=sig==false?0:1; return sig; } };