Leetcode:分割回文串
题目描述:给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。
回文串 是正着读和反着读都一样的字符串。
示例 1:
输入:s = "aab"
输出:[["a","a","b"],["aa","b"]]
示例 2:
输入:s = "a"
输出:[["a"]]
判断回文第一反应就是动态规划
然后要把符合条件的回文子串构成的数组加入结果中,利用回溯,一般pop_back()会跟在迭代的后面
class Solution {
private:
vector<vector<int>> f;
vector<vector<string>> ret;
vector<string> ans;
int n;
public:
void dfs(const string& s, int start) {
if (start == n) {
ret.push_back(ans);
return;
}
//如果上一步没有加入ret当中,证明后面还有字符没有遍历完
for (int end = start; end < n; ++end) {
//如果回文数组为true,则进行start的替换,否则继续for
if (f[start][end]) {
//在判断是否为回文的数组里,如果start~end内的字符能够构成回文
//则把该字段的字符进行切片
ans.push_back(s.substr(start, end - start + 1));
//往字符串的下一个走,看后面的字符是否能构成回文串
dfs(s, end + 1);
//会保留之前进入数组的值
ans.pop_back();
}
}
}
vector<vector<string>> partition(string s) {
n = s.size();
//初始化为一个4x4的全1的二维矩阵
f.assign(n, vector<int>(n, true));
//判断是否为回文子串,动态规划
for (int j = 1; j < n; j++) {
for (int i = 0; i < j; i++) {
f[i][j] = (s[i] == s[j]) && f[i + 1][j - 1];
}
}
dfs(s, 0);
return ret;
}
};
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律