LeetCode 算法:分割回文串 c++

原题链接🔗:分割回文串
难度:中等⭐️⭐️

题目

给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。

示例 1:

输入:s = “aab”
输出:[[“a”,“a”,“b”],[“aa”,“b”]]

示例 2:

输入:s = “a”
输出:[[“a”]]

提示:

  • 1 <= s.length <= 16
  • s 仅由小写英文字母组成

回文串

回文串,也称为回文字符串,是指一个字符串正读和反读都一样。例如,“level”和“madam”都是英语中的回文串。在编程中,经常会遇到判断一个字符串是否是回文串的问题。这个问题可以通过以下步骤解决:

  1. 标准化:通常首先将字符串转换为统一的大小写(通常是小写),以忽略大小写的差异。
  2. 去除空白和标点:如果问题要求忽略空格、标点和特殊字符,需要先将这些从字符串中去除。
  3. 比较字符:从字符串的两端开始,逐个比较对应位置的字符是否相同。
  4. 判断结果:如果在比较过程中发现有不匹配的字符,那么该字符串就不是回文串。如果所有对应位置的字符都匹配,那么该字符串是回文串。

以下是一个简单的Python函数,用来判断一个字符串是否是回文串:

def is_palindrome(s):# 将字符串转换为小写并去除非字母数字字符cleaned = ''.join(c for c in s.lower() if c.isalnum())# 比较字符串和它的反转是否相同return cleaned == cleaned[::-1]# 示例
print(is_palindrome("A man, a plan, a canal: Panama"))  # 应该返回True

在这个函数中,使用了字符串的切片功能cleaned[::-1]来获取它的反转,这是一种简洁的方法来检查字符串是否是回文。

题解

  1. 解题思路

这个问题可以使用动态规划(Dynamic Programming, DP)来解决。以下是解题的步骤:

  • 定义状态:设dp[i]表示字符串s[0…i-1]的分割方案数。

  • 状态转移方程:对于每个i,检查s[j]到s[i-1](j从0到i-1)是否是回文串。如果是,那么dp[i]可以从dp[j]转移过来。

  • 初始化:dp[0] = 1,表示空字符串有一种分割方案。

  • 计算顺序:按照从左到右的顺序计算dp[i]。

  • 回文串检查:可以使用双指针(快慢指针)的方法来检查s[j]到s[i-1]是否是回文串。

  • 状态更新:对于每个i,更新dp[i]为所有可以形成回文串的j的dp[j]之和。

  • 结果:最终dp[s.length()]即为所求的不同分割方案数。

  1. c++ demo
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>using namespace std;// 判断字符串是否是回文
bool isPalindrome(const string& s) {return equal(s.begin(), s.end(), s.rbegin());
}// 辅助函数,用于回溯找到所有分割方案
void findPartitions(const string& s, int start, vector<string>& current, vector<vector<string>>& result) {if (start == s.size()) {if (!current.empty()) {result.push_back(current);}return;}for (int end = start; end < s.size(); ++end) {if (isPalindrome(s.substr(start, end - start + 1))) {current.push_back(s.substr(start, end - start + 1));findPartitions(s, end + 1, current, result);current.pop_back();}}
}// 返回所有可能的分割方案
vector<vector<string>> partitionPalindromes(const string& s) {vector<vector<string>> result;vector<string> current;findPartitions(s, 0, current, result);return result;
}int main() {string s = "abcba";vector<vector<string>> partitions = partitionPalindromes(s);for (const auto& part : partitions) {for (const string& str : part) {cout << str << " ";}cout << "\n";}cout << "Total partitions: " << partitions.size() << endl;return 0;
}
  • 运行结果

a b c b a
a bcb a
abcba
Total partitions: 3

  1. 代码仓库地址:partitionPalindromes

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/49072.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PHP银行卡实名认证接口对接、银行卡识别

在这个数字时代&#xff0c;每一张银行卡都承载着你的故事&#xff0c;它是你辛勤汗水的见证&#xff0c;是你生活品质的保障。就像你的身份证一样&#xff0c;银行卡也需要“实名认证”&#xff0c;这不仅仅是一次信息的匹配&#xff0c;更是对个人财产安全的一份承诺。 随着…

docker大全

1. 简述什么是 Docker 容器&#xff1f; Docker 容器 在应用程序层创建抽象并将应用程序及其所有依赖项打包在一起。这使我们能够快速可靠地部署应用程序。容器不需要我们安装不同的操作系统。相反&#xff0c;它们使用底层系统的 CPU 和内存来执行任务。这意味着任何容器化应…

云计算安全技术介绍

云计算安全技术介绍 安全概述物理安全基础设施安全网络安全网络安全威胁防火墙ACLIDS 入侵检测系统IPS 入侵预防系统VPNSSLSSL VPNSSHHTTPSCHAP 询问握手认证协议数字签名数据安全虚拟化安全管理安全安全概述 安全是指不因人、机、媒介的相互作用而导致系统损失、人员伤害、任…

【系列专题】新质生产力之光,照亮“制造强国”之路

随着科技的不断进步和全球化的深入发展&#xff0c;新质生产力已经成为推动现代社会经济发展的重要力量。在新质生产力布局中&#xff0c;改造提升传统产业是重要内容之一。中国制造业总体规模连续14年保持全球第一&#xff0c;新质生产力的加快发展&#xff0c;将加速推动我国…

数据库对象中出现复杂的对象嵌套,如何使用Mybatis plus优雅的解决这个问题:

起因 类原型&#xff1a; 在User类&#xff1a; package com.itheima.mp.domain.po;import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.IdType; import java.time…

VBA:随机生成100以内两位数加减法练习

给儿子用&#xff0c;每天一百道&#xff0c;哈哈哈 Sub add_ranknum()Dim num1 As Integer, num2 As Integer, num3 As Integer, temp As Integer Dim operat As StringFor c 1 To 10 Step 2 For i 1 To 20 NX:Randomizenum1 Rnd * 99num2 Rnd * 99If num1 num2 Then GoT…

在linux上创建android构建环境

1.先安装java环境(此处我安装的是amazon的jdk) java8 后续环境需java17 wget https://corretto.aws/downloads/latest/amazon-corretto-8-x64-linux-jdk.tar.gz sudo wget wget https://corretto.aws/downloads/latest/amazon-corretto-17-x64-linux-jdk.tar.gz 解压 sudo…

阿里云ubuntu宝塔面板部署uni-app-flask-websocket前后端项目

1.下载宝塔面板 wget -O install.sh https://download.bt.cn/install/install-ubuntu_6.0.sh && sudo bash install.sh ed8484bec 然后去安全组开放对应的端口 面板账户登录信息 【云服务器】请在安全组放行 29725 端口 进入控制面板后修改默认用户名和密码 2. …

HTML 相册2.0 通过css 获取图片资源 2024/7/22 日志

简单方法通过css 绕过同源策略 以获取资源 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>水面倒影…

从理论到实践:如何用 TDengine 打造完美数据模型​

在用 TDengine 进行数据建模之前&#xff0c;我们需要回答两个关键问题&#xff1a;建模的目标用户是谁&#xff1f;他们的具体需求是什么&#xff1f;在一个典型的时序数据管理方案中&#xff0c;数据采集和数据应用是两个主要环节。如下图所示&#xff1a; 对于数据采集工程师…

Python中的__new__方法及实现单例模式

在Python中&#xff0c;类的实例化过程通常由两个主要方法控制&#xff1a;__new__和__init__。虽然我们大多数时候只需要关注__init__方法&#xff0c;但__new__方法在某些高级用例中非常有用。本文将详细介绍__new__方法&#xff0c;解释其定义、使用场景以及与__init__方法的…

EXCEL怎么自动添加表格吗?

第一步&#xff0c;选中需要添加表格的范围 第二步&#xff0c;点击开始&#xff0c;选择条件格式&#xff0c;“使用公式确定要设置格式的单元格” 第三步&#xff0c;编辑规则说明加上<>"" 第四步&#xff0c;点击边框&#xff0c;选择外边框确定即可&#x…

matlab 中的methods(Access = protected) 是什么意思

gpt版本 在 MATLAB 中&#xff0c;methods 是用于定义类方法的一部分。(Access protected) 是一种访问控制修饰符&#xff0c;它限制了方法的访问权限。具体来说&#xff0c;当你在类定义中使用 methods(Access protected) 时&#xff0c;你是在定义只有类本身及其子类可以访…

bash 笔记

这一篇的内容&#xff0c;太乱了。以后再整理: 把熟悉的内容删掉。不熟悉的内容放到前面。 # bash: export HOME$PWD export PS1"$" 更简短把 home 把当前目录设置为 home, 目的是缩短命令提示符前面的内容。 看起来更简短。zcat labevents.csv.gz | awk -F, (…

电脑没有摄像头怎么用手机当摄像头?虚拟摄像头使用的详细教程来了(全)

随着科技水平以及全球化经济的快速发展&#xff0c;视频会议、在线课程和直播已经成为日常办公或者生活中必不可少的一个环节。然而&#xff0c;在如今仍有许多台式电脑和一些老旧的笔记本电脑并没有内置摄像头&#xff0c;亦或者自带的摄像头质量不够理想&#xff0c;这使得视…

1小时上手Alibaba Sentinel流控安全组件

微服务的雪崩效应 假如我们开发了一套分布式应用系统&#xff0c;前端应用分别向A/H/I/P四个服务发起调用请求&#xff1a; 但随着时间推移&#xff0c;假如服务 I 因为优化问题&#xff0c;导致需要 20 秒才能返回响应&#xff0c;这就必然会导致20秒内该请求线程会一直处于阻…

跟代码执行流程,读Megatron源码(四)megatron训练脚本initialize.py之initialize_megatron()分布式环境初始化

在前文中&#xff0c;我们讲述了pretrain函数的执行流程&#xff0c;其首要步骤是megatron分组的初始化与环境的配置。本文将深入initialize_megatron函数源码&#xff0c;剖析其初始化分布式训练环境的内部机制。 注&#xff1a;在此假设读者具备3D并行相关知识 一. initiali…

引入缓存带来的问题以及解决方案

目录 前言 问题与解决方案 缓存击穿 缓存穿透 缓存雪崩 缓存一致性 前言 在提升接口性能的方案中&#xff0c;毫无疑问&#xff0c;使用缓存是最有效果的&#xff0c;但同时也会带来新的问题。 缓存击穿缓存穿透缓存雪崩缓存一致性 以上问题都是引入缓存需要考虑的&am…

react入门到实战-day2-7.21

昨天晚上刚学完已经一点了&#xff0c;来不及写笔记&#xff0c;主要是想睡觉哈&#xff0c;所以今天补上&#xff0c;我发现效率还挺高的&#xff0c;今天重新做笔记&#xff0c;加固了昨天的知识点&#xff0c;要不以后都这样子哈&#xff0c;学完第二天再写哈&#xff0c;要…

【Linux】从零开始认识多线程 --- 线程ID

在这个浮躁的时代 只有自律的人才能脱颖而出 -- 《觉醒年代》 1 前言 上一篇文章中讲解了线程控制的基本接口&#xff1a; 线程创建pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);: pthread_t *thread :输出…