---
# System prepended metadata

title: 131. Palindrome Partitioning
tags: [Leetcode]

---

<style>
    html, body, .ui-content {
    background: #222222;
    color: #00BFFF;
}
    /* 設定 code 模板 */
    .markdown-body code,
.markdown-body tt {
    background-color: #ffffff36;
}
.markdown-body .highlight pre,
.markdown-body pre {
    color: #ddd;
    background-color: #00000036;
}
.hljs-tag {
    color: #ddd;
}
.token.operator {
  background-color: transparent;
}    
/* 設定連結 */
a,
.open-files-container li.selected a {
    color: #89FFF8;
    
}
a:hover,
.open-files-container li.selected a:hover {
    color: #89FFF890;
}
   
</style>

###### tags: `Leetcode`

# 131. Palindrome Partitioning

###### Link : https://leetcode.com/problems/palindrome-partitioning/description/

## 題目
回傳切割原字串後，所有子字串皆為回文的可能
## 程式碼 I
```cpp=
class Solution {
public:
    vector<vector<string>> partition(string s) {
        ans.clear();
        vector<string> current;
        backtracking(current, s, 0, 0);
        return ans;
    }
private:
    void backtracking(vector<string> &current, string &s, int start, int end){
        if(end >= s.size()){
            //走訪字串完畢
            if(isPalindrome(current) && Count(current) == s.size())
                //所有子字串都是回文且字元數量符合string s才將答案放進去
                ans.push_back(current);
            return;
        }
        //將自己加入current
        current.push_back(s.substr(start, end - start + 1));
        backtracking(current, s, end + 1, end + 1);
        //不加入current
        current.pop_back();
        backtracking(current, s, start, end + 1);
        return;
    }
    int Count(vector<string> &s){
        int ret = 0;
        for(auto &str : s)
            for(auto &Char : str)
                ret++;
        return ret;
    }
    bool isPalindrome(vector<string> cur){
        for(auto &str : cur)
            if(!isPalindrome(str))
                return false;
        return true;
    }
    bool isPalindrome(string s){
        for(int i = 0, j = s.size() - 1;i < j;i++, j--)
            if(s[i] != s[j]) 
                return false;
        return true;
    }
    vector<vector<string>> ans;
};
```
## 程式碼 II (Better Solution)
放入current時，只將是回文的放進去，並繼續跑遞迴
```cpp=
class Solution {
public:
    vector<vector<string>> partition(string s) {
        ans.clear();
        vector<string> current;
        backtracking(current, s, 0);
        return ans;
    }
private:
    void backtracking(vector<string> &current, string &s, int start){
        if(start >= s.size()){
            ans.push_back(current);
            return;
        }
        for(int end = start;end < s.size();end++){
            if(isPalindrome(s, start, end)){
                current.push_back(s.substr(start, end - start + 1));
                backtracking(current, s, end + 1);
                current.pop_back();
            }
        }
        return;
    }
    bool isPalindrome(string &s, int start, int end){
        while(start < end)
            if(s[start++] != s[end--])
                return false;
        return true;
    }
    vector<vector<string>> ans;
};
```
## Date 
### 2023/1/22