考察的知识点:递归、回溯;
解答方法分析:
- 定义名为isPalindrome的辅助函数,用来判断一个字符串是否为回文串。通过两个指针从字符串的两端向中间进行比较,如果对应位置的字符不相等,则不是回文串。
- 定义名为backtrack的辅助函数,用来进行回溯操作。该函数有三个参数,分别为当前处理的字符串s结果集res,以及临时列表temp。
- 如果字符串s为空,表示已经将当前的分组方案添加到了结果集中,将临时列表temp添加到结果集res中,并返回。
- 对于非空字符串s,遍历所有可能的切割起始位置i,从1到s的长度。
- 获取从起始位置i开始的子串sub,然后判断sub是否为回文串。
- 如果是回文串,则将sub加入临时列表temp中,并对剩余部分递归调用backtrack函数。
- 递归调用完成后,将刚刚加入临时列表的子串移除,继续遍历下一个起始位置,进行下一次回溯。
- 在主函数partition中,初始化结果集res和临时列表temp,然后调用backtrack函数。
- 最后,对结果集res进行升序排序,并返回结果。
所用编程语言:C++;
完整编程代码:↓
class Solution { public: bool isPalindrome(string s) { int i = 0, j = s.length() - 1; while (i < j) { if (s[i] != s[j]) return false; i++; j--; } return true; } void backtrack(string s, vector<vector<string>>& res, vector<string>& temp) { if (s.empty()) { res.push_back(temp); return; } for (int i = 1; i <= s.length(); i++) { string sub = s.substr(0, i); if (isPalindrome(sub)) { temp.push_back(sub); backtrack(s.substr(i), res, temp); temp.pop_back(); } } } vector<vector<string>> partition(string s) { vector<vector<string>> res; vector<string> temp; backtrack(s, res, temp); sort(res.begin(), res.end()); return res; } };