【Palindrome Partitioning】cpp
题目:
Given a string s, partition s such that every substring of the partition is a palindrome.
Return all possible palindrome partitioning of s.
For example, given s = "aab"
,
Return
[ ["aa","b"], ["a","a","b"] ]
代码:
class Solution { public: vector<vector<string>> partition(string s) { vector<vector<string> > ret; vector<string> tmp; Solution::dfs(ret, tmp, s, 0, s.size()-1); return ret; } static void dfs(vector<vector<string> >& ret, vector<string>& tmp, string& s, int begin, int end) { if ( begin>end ) { ret.push_back(tmp); return; } for ( int i = begin; i <= end; ++i ) { if ( Solution::isPalindrome(s, begin, i) ) { tmp.push_back(s.substr(begin,i-begin+1)); Solution::dfs(ret, tmp, s, i+1, end); tmp.pop_back(); } } } static bool isPalindrome(string& s, int begin, int end) { while ( begin<end && s[begin]==s[end] ) { begin++; end--; } return begin>=end; } };
tips:
把问题转化为深搜:字符串s有n个字符,因此可以有n个切的位置(包括不切)。
按照深搜的模板写出来代码(dfs终止条件;深搜遍历条件等)。
注意一个细节,传入下一层dfs时是从i+1到end,之前一直写成了begin+1犯了低级错误。
深搜的时间复杂度为O(2^n) 空间复杂度为O(1)。
深搜在这道题上也有不足之处,很多子字符串是否是回文算过了不止一遍,自然联想能否用动规算法保存每一轮的判断结果。
====================================================
先往后走,后面再研究动态规划的做法。
==================================================
第二次过这道题,用dfs做的,其中每层里面i代表的是截取字符串的长度,自然由1到s.size()。
class Solution { public: vector<vector<string> > partition(string s) { vector<vector<string> > ret; vector<string> tmp; Solution::dfs(ret, tmp, s); return ret; } static void dfs(vector<vector<string> >& ret, vector<string>& tmp, string s) { if ( s.size()<1 ) { ret.push_back(tmp); return; } for ( int i=1; i<=s.size(); ++i ) { if ( Solution::isPalindrome(s.substr(0,i)) ) { tmp.push_back(s.substr(0,i)); Solution::dfs(ret, tmp, s.substr(i,s.size()-i)); tmp.pop_back(); } } } static bool isPalindrome(string s) { int begin = 0; int end = s.size()-1; while ( begin<end ) { if ( s[begin]!=s[end] ) return false; begin++; end--; } return true; } };
分类:
cpp刷Leetcode
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?