当前位置: 首页 > news >正文

【回溯+双指针算法题记录】回文字符串汇总

目录

  • 验证回文串
    • 题目描述
    • 题目分析
    • cpp代码
  • 131. 分割回文串
    • 题目描述
    • 题目分析
    • cpp代码

验证回文串

题目🔗

题目描述

如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串

字母和数字都属于字母数字字符。

给你一个字符串 s,如果它是 回文串 ,返回 true ;否则,返回 false

题目分析

这题主要问题在于包含非字母/数字字符,比如:' '','':'等,所以我们要把这些情况考虑进去。

cpp代码

class Solution {
public:bool isPalindrome(string s) {int i = 0;int j = s.size()-1;while(i < j){while(i < j && !(isdigit(s[i]) || isalpha(s[i]))) i++;while(i < j && !(isdigit(s[j]) || isalpha(s[j]))) j--;if(tolower(s[i]) == tolower(s[j])){i++; j--;}else return false;}return true;}
};

这里用了几个C库函数,方便我们处理:

  1. isdigit(x):判断x是否是数字;
  2. isalpha(x):判断x是否是字母;
  3. tolower(x):将大写字母转换成小写字母(如果本身是非字母字符则不变)。

131. 分割回文串

题目🔗

题目描述

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

题目分析

其实切割问题和组合问题本质上是一样的,我们将int startIndex当作上一次的分割结束点,横向是从startIndexi这个区间切割的可能情况,纵向是针对每一种可情况的startIndexi切割,再从i+1开始向后分割,即i+1就是上一次的分割结束点。

每次分割时可以判断当前startIndexi是不是回文字符串,如果是,则将当前分割结果放入path中,如果不是就continue,去看下一个startIndexi

cpp代码

class Solution {
public:vector<string> path;vector<vector<string>> result;bool isPalindrome(string s, int i, int j) {// int i = 0;// int j = s.size()-1;while(i < j){while(i < j && !(isdigit(s[i]) || isalpha(s[i]))) i++;while(i < j && !(isdigit(s[j]) || isalpha(s[j]))) j--;if(tolower(s[i]) == tolower(s[j])){i++; j--;}else return false;}return true;}void backtracking(int startIndex, const string& s){// 终止条件if(startIndex >= s.size()){ // 当startIndex超出s大小,则放结果result.push_back(path);return;}for(int i = startIndex; i < s.size(); i++){if(isPalindrome(s, startIndex, i)){ // 如果当前切割是回文串string str = s.substr(startIndex, i - startIndex + 1);path.push_back(str);}else continue;backtracking(i + 1, s);path.pop_back();}}vector<vector<string>> partition(string s) {result.clear();path.clear();backtracking(0, s);return result;}
};
http://www.lryc.cn/news/396312.html

相关文章:

  • 【AI资讯早报】AI科技前沿资讯概览:2024年7月10日早报
  • DDR3 SO-DIMM 内存条硬件总结(一)
  • 磁力搜索引擎是什么?为什么有些资源喜欢用磁力链接?
  • Vue基础--v-model/v-for/事件属性/侦听器
  • 『大模型笔记』GraphRAG:用于复杂数据发现的新工具现已在GitHub上发布
  • LabVIEW机器视觉技术在产品质量检测中有哪些应用实例
  • 【Linux】多线程_2
  • 58、基于径向基神经网络的曲线拟合(matlab)
  • 3.上传图片(阿里云空间,oss验证)
  • 仪表板展示|DataEase看中国:2023年中国新能源汽车经济运行情况分析
  • “Numpy数据分析与挖掘:高效学习重点技能“
  • 百川工作手机实现销售管理微信监控系统
  • RAG 工业落地方案框架(Qanything、RAGFlow、FastGPT、智谱RAG)细节比对!CVPR自动驾驶最in挑战赛赛道,全球冠军被算力选手夺走了
  • 华为防火墙 拓扑搭建1
  • Linux 利用命名空间创建一个自己的“容器“
  • RAG的学习与实践——LangChain和LlamaIndex学习笔记
  • Python爬虫原理以及3个小案例(源码)
  • Vagrant配合VirtualBox搭建虚拟机
  • Elasticsearch 建议(Suggesters):实现自动补全和拼写检查
  • 部署过docker后,防火墙firewall与iptables的基本指令
  • 华为 RIP 协议中 RIP 兼容版本、RIPv1、RIPv2 在收发 RIP 报文时的区别
  • 深度学习pytorch多机多卡网络配置桥接方法
  • 服务器信息获取工具
  • uniapp 防止重复提交数据
  • 线程池工具类
  • 印尼“支付宝” DANA 如何借力 OceanBase 实现3个“关键零”
  • 2018-2022 年份微博签到数据集
  • Avalonia开发实践(二)——开发带边框的Grid
  • Java泛型的定义与运用
  • Java如何自定义注解及在SpringBoot中的应用