首页 > 编程语言 >【每周例题】力扣 C++ 分割字符串

【每周例题】力扣 C++ 分割字符串

时间:2024-04-22 20:55:18浏览次数:19  
标签:return res C++ 力扣 start vector ans 例题 回文

分割字符串

题目

 题目分析

1.先确定用容器存储,容器的存储结构如下图所示:

 2.这个题目的话,第一反应应该是用到动态规划,下面是动态规划的模板:

res = []
ans = []

def backtrack(未探索区域, res, path):
    if 未探索区域满足结束条件:
        res.add(ans) # 深度拷贝
        return
    for 选择 in 未探索区域当前可能的选择:
        if 当前选择符合要求:
            path.add(当前选择)
            backtrack(新的未探索区域, res, ans)
            path.pop()

如果发现字符串为空,则直接加入res,因为空字符串一定是回文字符串。

如果不为空,则使用substr函数,进行字符串提取,再加入回文字符串判断,如果是回文字符串,则加入ans,然后继续处理剩下部分

// 回溯函数,用于生成所有回文子串的组合  
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.这里需要处理回文串。回文字符串:是一个正读和反读都一样的字符串。

下面是回文串的判断:

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;
}

代码

普通代码

#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;
}

力扣代码

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;
    }
};

  

标签:return,res,C++,力扣,start,vector,ans,例题,回文
From: https://www.cnblogs.com/hcrzhi/p/18151524

相关文章

  • 【每周例题】力扣 C++ 最小和分割
    最小和分割题目 题目分析1.num1 和 num2 中所有数字出现的次数之和等于 num 中所有数字出现的次数。即,num1与num2是从num中提取出来的,且不会重复提取同一个数字,且提取的顺序并不需要按照num的数字顺序2.返回 num1 和 num2 可以得到的和的最小值。要想得到最小值,需......
  • C++八股之函数重载与重写-静态多态与动态多态
    重载:是指在同一作用域中允许存在多个同名函数,⽽这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。重载与类无关,重载实现编译时多态,属于静态绑定。重写:指⼦类新定义⽗类的函数的做法。如果重写的函数在父类中是虚函数,那么能够实现动态多态。如果在父类中没......
  • UE4纯C++实现游戏中快捷栏之创建快捷栏UI
    作为一个在游戏界面中显示的快捷栏,我们需要在游戏运行时就显示出快捷栏UI,故我们创建两个Widget。1.SlAiGameHUDWidget:负责游戏中界面UI的整体显示2.SlAiShortcutWidget:负责快捷栏部件的显示与逻辑然后我们通过:1.将GameHUDWidget添加进视口:在GameHUD文件中添加Game......
  • 深度解读《深度探索C++对象模型》之数据成员的存取效率分析(三)
    接下来我将持续更新“深度解读《深度探索C++对象模型》”系列,敬请期待,欢迎关注!也可以关注公众号:iShare爱分享,自动获得推文和全部的文章列表。前面两篇请通过这里查看:深度解读《深度探索C++对象模型》之数据成员的存取效率分析(一)深度解读《深度探索C++对象模型》之数据成员的......
  • C++ 上位软件通过Snap7开源库访问西门子S7-1200/S7-1500数据块的方法
    前言本人一直从事C++上位软件开发工作较多,在之前的项目中通过C++访问西门子PLCS7-200/S7-1200/S7-1500并进行数据交互的应用中一直使用的是ModbusTCP/ModbusRTU协议进行。Modbus上位开源库采用的LibModbus。经过实际应用发现Modbus开源库单次发送和接受的数据不能超......
  • C++ 连接pg数据库
    环境:windows10vs2022引入pqxxs一些增删改查的示例代码#include"pqxx/pqxx"voidinsertPg(){try{//建立连接pqxx::connectionconn("dbname=postgresuser=postgrespassword=123hostaddr=127.0.0.1port=5432");//添加数据......
  • 力扣周赛394之别样DP + 别样Dijkstra
    别样DP题目链接https://leetcode.cn/problems/minimum-number-of-operations-to-satisfy-conditions/description/题目大意题目思路需要考虑m列每一列填什么的情况,因为最终每一列都是一样的考虑暴力,每一列都可以变成0-9有\(10^m\)次种情况,这必然是不可行的我们从前往......
  • 关于c++输入输出缓冲区,和IO加速流的一些理解
    首先,让我们来介绍一下这个函数ios::sync_with_stdio();这个函数在缺省状态下默认为true,即开启,这个函数的作用是同步c和c++的缓冲区这个操作是c++为了兼容c而做出的保守决定,即将c和c++的缓冲区合并为一个,但是这样会带来性能上的开销为什么呢?因为这个兼容缓冲区先执行c的输入输......
  • C与C++的内存管理
    C中的malloc/relloc/calloc/free1.malloc与freemalloc函数用于分配指定大小的内存空间,并返回空间的首地址,若分配失败则返回NULL。free用来释放已分配的内存空间。intmain(){ int*ptr=(int*)malloc(sizeof(int)*10);//分配十个int型的空间 if(ptr==NULL){ pr......
  • C++U7-1-高精度加减
    学习目标    高精度加法        [高精度加法] #include<bits/stdc++.h>usingnamespacestd;intmain(){stringa;stringb;intc[10089]={0};intd[10089]={0};inte[10089]={0};cin>>a>>b;in......