回文分区 - C++力扣131题
题目链接:https://leetcode.com/problems/palindrome-partitioning/description/
解题思路
题目要求我们把所有的可能都列出来,即就算有重复(但排序不一样)的也要列出来,那么我们很明显就是要用 dfs 弄一遍,然后就是看字符串和列表的操作了。我们以字符串 aab
为例,我们可以通过以下步骤获得所有的可能:
- 判断
a
是否为回文,若是,则将a
加入列表。之后剩下ab
,同样判断a
和b
以及ab
; - 判断
aa
是否为回文,若是,则将aa
加入列表。之后剩下b
,同样判断b
; - 判断
aab
是否为回文,若是,则将aab
加入列表;
完整代码:
class Solution {
public:
bool isPalindrome(string s) {
if(s.size() == 0) return false;
int l = 0, r = s.size() - 1;
while(l <= r) {
if(s[l] != s[r]) return false;
l++; r--;
}
return true;
}
void dfs(vector<vector<string>> &ret, vector<string> &tmp, string s) {
if(s.size() == 0) {
ret.push_back(tmp);
return ;
}
for(int i = 0; i < s.size(); i++) {
string s1 = s.substr(0, i + 1);
if(isPalindrome(s1)) {
tmp.push_back(s1);
dfs(ret, tmp, s.substr(i + 1));
tmp.pop_back();
}
}
return ;
}
vector<vector<string>> partition(string s) {
vector<vector<string>> ret;
vector<string> tmp;
dfs(ret, tmp, s);
return ret;
}
};
版权属于:江筱雨
本文链接:https://www.yuisblog.com/archives/211/
本站未注明转载的文章均为原创,并采用
CC BY-NC-SA 4.0 授权协议,转载请注明来源,谢谢!