【每周例题】力扣 C++ 分割字符串
分割字符串
题目
题目分析
1.先确定用容器存储,容器的存储结构如下图所示:
2.这个题目的话,第一反应应该是用到动态规划,下面是动态规划的模板:
1 2 3 4 5 6 7 8 9 10 11 12 | res = [] ans = [] def backtrack(未探索区域, res, path): if 未探索区域满足结束条件: res.add(ans) # 深度拷贝 return for 选择 in 未探索区域当前可能的选择: if 当前选择符合要求: path.add(当前选择) backtrack(新的未探索区域, res, ans) path.pop() |
如果发现字符串为空,则直接加入res,因为空字符串一定是回文字符串。
如果不为空,则使用substr函数,进行字符串提取,再加入回文字符串判断,如果是回文字符串,则加入ans,然后继续处理剩下部分
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | // 回溯函数,用于生成所有回文子串的组合 void backtrack( const string & s, int start, vector<vector< string >>& res, vector< string >& ans) { if (start == s.size()) //空字符串 { res.push_back(ans); // 将当前组合添加到结果中 return ; } for ( int i = start; i < s.size(); ++i) { string str1 = s.substr(start, i - start + 1); if (isPalindrome(str1)) { ans.push_back(str1); // 将当前回文子串添加到当前组合中 backtrack(s, i + 1, res, ans); // 递归处理剩余部分 ans.pop_back(); // 回溯,移除当前回文子串以尝试其他组合 } } } |
3.这里需要处理回文串。回文字符串:是一个正读和反读都一样的字符串。
下面是回文串的判断:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | bool isPalindrome( const string & s) { int start = 0; int end = s.size() - 1; while (start < end) { if (s[start] != s[end]) { return false ; } start++; end--; } return true ; } |
代码
普通代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | #include<iostream> #include<vector> #include<string> using namespace std; // 检查是否为回文串 bool isPalindrome( const string & s) { int start = 0; int end = s.size() - 1; while (start < end) { if (s[start] != s[end]) { return false ; } start++; end--; } return true ; } // 回溯函数,用于生成所有回文子串的组合 void backtrack( const string & s, int start, vector<vector< string >>& res, vector< string >& ans) { if (start == s.size()) //空字符串 { res.push_back(ans); // 将当前组合添加到结果中 return ; } for ( int i = start; i < s.size(); ++i) { string str1 = s.substr(start, i - start + 1); if (isPalindrome(str1)) { ans.push_back(str1); // 将当前回文子串添加到当前组合中 backtrack(s, i + 1, res, ans); // 递归处理剩余部分 ans.pop_back(); // 回溯,移除当前回文子串以尝试其他组合 } } } // 主函数,用于生成给定字符串的所有回文子串组合 vector<vector< string >> generatePalindromeSubstrings( const string & s) { vector<vector< string >> res; vector< string > ans; backtrack(s, 0, res, ans); return res; } int main() { string s; cin >> s; vector<vector< string >> results = generatePalindromeSubstrings(s); for ( const auto& combo : results) { for ( const auto& str : combo) { cout << str << " " ; } cout << endl; } return 0; } |
力扣代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | class Solution { public : bool isPalindrome( const string & s) { int start = 0; int end = s.size() - 1; while (start < end) { if (s[start] != s[end]) { return false ; } start++; end--; } return true ; } void backtrack( const string & s, int start, vector<vector< string >>& res, vector< string >& ans) { if (start == s.size()) { res.push_back(ans); // 将当前组合添加到结果中 return ; } for ( int i = start; i < s.size(); ++i) { string str1 = s.substr(start, i - start + 1); if (isPalindrome(str1)) { ans.push_back(str1); // 将当前回文子串添加到当前组合中 backtrack(s, i + 1, res, ans); // 递归处理剩余部分 ans.pop_back(); // 回溯,移除当前回文子串以尝试其他组合 } } } vector<vector< string >> generatePalindromeSubstrings( const string & s) { vector<vector< string >> res; vector< string > ans; backtrack(s, 0, res, ans); return res; } vector<vector< string >> partition( string s) { vector<vector< string >> results = generatePalindromeSubstrings(s); return results; } }; |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现