1. 程式人生 > 其它 >【JDBC】學習路徑10-c3p0資料來源的使用(JDBC完結)

【JDBC】學習路徑10-c3p0資料來源的使用(JDBC完結)

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;
    }
};