【每周例题】力扣 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;
    }
};

  

posted @   山远尽成云  阅读(31)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示