###### tags: `LeetCode` `DFS` `Medium` `String`
# LeetCode #131 [Palindrome Partitioning](https://leetcode.com/problems/palindrome-partitioning/)
### (Medium)
給你一個字符串 s,請你將 s 分割成一些子串,使每個子串都是 回文串 。返回 s 所有可能的分割方案。
回文串 是正著讀和反著讀都一樣的字符串。
---
兩個重點:
1. 判斷字串是否為回文
2. 如何遍歷整個字串
判斷字串是否為回文的方法是將字串反轉, 然後比對反轉後的字串與原字串是否相等。
遍歷字串的方式:從長度1開始切割字串, 當切割的字串為回文時, 就將該回文字串存入暫存數組中, 並從下一個字元開始呼叫遞迴, 直到指標位置等於整個字串的長度, 此時將暫存數組存入答案數組中, 然後返回。而在整個迴圈遍歷完成後, 也需要返回。
需要注意的點是i的範圍從1到s.size()-pos。
---
```
class Solution {
public:
vector<vector<string>> partition(string s) {
vector<string> tmp;
vector<vector<string>> ans;
dfs(0, tmp, ans, s);
return ans;
}
bool check(string s){
string tmp = s;
reverse(tmp.begin(), tmp.end());
if(tmp==s)return true;
return false;
}
void dfs(int pos, vector<string>& tmp, vector<vector<string>>& ans, const string& s){
if(pos==s.size()){
ans.push_back(tmp);
return;
}
for(int i=1;i<=s.length()-pos;i++){
string subs = s.substr(pos, i);
if(!check(subs))continue;
tmp.push_back(subs);
dfs(i+pos, tmp, ans, s);
tmp.pop_back();
}
return;
}
};
```