【C++】B2124 判断字符串是否为回文


在这里插入图片描述

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳]
本文专栏: C++

文章目录

  • 💯前言
  • 💯题目描述
    • 输入格式:
    • 输出格式:
    • 样例:
  • 💯方法一:我的第一种做法
    • 思路
    • 代码实现
    • 解析
  • 💯方法二:我的第二种做法
    • 思路
    • 代码实现
    • 解析
    • 改进建议
  • 💯方法三:老师的第一种做法
    • 思路
    • 代码实现
    • 解析
    • 优点
  • 💯方法四:老师的第二种做法
    • 思路
    • 代码实现
    • 解析
    • 优点
    • 缺点
  • 💯对比分析
  • 💯扩展:空间优化和实际应用
  • 💯小结


在这里插入图片描述


💯前言

  • 判断一个字符串是否为回文是编程中常见的问题。回文字符串是指从前往后读与从后往前读都一样的字符串。例如,“abcdedcba” 就是回文,而 “abcde” 则不是。对于这类问题,我们可以采用多种不同的算法来解决。在本篇文章中,我们将分析四种不同的做法,并进行对比与优化,以帮助大家更好地理解如何判断字符串是否为回文。
    C++ 参考手册
    在这里插入图片描述

💯题目描述

B2124 判断字符串是否为回文
在这里插入图片描述

输入一个字符串,判断该字符串是否是回文。回文是指顺读和倒读都一样的字符串。

输入格式:

输入一行字符串,长度小于100。

输出格式:

如果字符串是回文,输出 yes;否则,输出 no

样例:

输入

abcdedcba

输出

yes

💯方法一:我的第一种做法

思路

我的第一种做法是通过反转字符串来判断回文。首先,我们将原字符串反转,然后与原字符串进行比较。如果反转后的字符串与原字符串相等,则说明原字符串是回文。

代码实现

#include <iostream>
#include <string>
using namespace std;int main() {string s;cin >> s;  // 输入字符串int left = 0;int right = s.size() - 1;// 检查字符串的前半部分是否与后半部分对称while (left < right) {if (s[left] != s[right]) {cout << "no" << endl;  // 如果有不同字符,输出noreturn 0;}left++;right--;}cout << "yes" << endl;  // 如果没有不同字符,输出yesreturn 0;
}

解析

  1. 反转字符串:通过双指针方式,使用 leftright 两个指针分别从字符串的两端开始向中间移动,逐个比较字符。
  2. 时间复杂度:O(n),其中 n 是字符串的长度。我们最多需要遍历字符串的前半部分,进行字符比较。
  3. 空间复杂度:O(1),仅使用了常数的空间来存储指针 leftright

💯方法二:我的第二种做法

思路

在我的第二种做法中,我尝试使用了两次循环,首先将字符串反转到一个新的字符串 s2 中,然后通过逐字符对比 s2 和原字符串 s1 是否一致来判断回文。

代码实现

#include <iostream>
#include <string>
using namespace std;int main() {string s1, s2;while(cin >> s1) {s2.resize(s1.size());  for(int i = s1.size() - 1; i >= 0; i--) {s2[s1.size() - i - 1] = s1[i];}int temp = 1;for(int i = 0; i < s1.size(); i++) {if(s2[i] != s1[i]) {temp = 0;break;}}if(temp)cout << "yes" << endl;elsecout << "no" << endl;}return 0;
}

解析

  1. 字符串反转:首先创建一个 s2 字符串,并使用 for 循环反转 s1 字符串的内容,存储到 s2 中。
  2. 回文判断:然后通过逐个字符对比 s2s1,如果遇到不同的字符,则输出 no
  3. 存在问题
    • s2 没有预先调整大小s2 在反转前没有设置大小,可能会导致内存越界。可以通过 resize 来调整其大小。
    • 逻辑错误break 的位置存在问题,导致判断逻辑不正确,跳出循环时判断不够精确。

改进建议

通过双指针法可以优化空间使用,并且避免了额外的字符串存储开销。具体改进后我们会在后面介绍。

💯方法三:老师的第一种做法

思路

老师的第一种做法采用了双指针法。这是一种非常高效的方法。通过两个指针,分别从字符串的两端开始,逐个比较字符,如果出现不同的字符,就可以直接返回 no,否则直到两个指针相遇时,输出 yes

代码实现

#include <iostream>
#include <string>
using namespace std;int main() {string s;cin >> s;  // 输入字符串int left = 0;int right = s.size() - 1;while (left < right) {if (s[left] != s[right]) {cout << "no" << endl;  // 如果有不同字符,输出noreturn 0;}left++;right--;}cout << "yes" << endl;  // 如果没有不同字符,输出yesreturn 0;
}

解析

  1. 双指针法:通过两个指针 leftright 从字符串的两端向中间逼近。每次比较 s[left]s[right],如果发现不相等,直接返回 no,否则继续向中间推进。
  2. 时间复杂度:O(n),每次最多需要遍历一次字符串的长度。
  3. 空间复杂度:O(1),只使用了常数空间来存储两个指针。

优点

  1. 空间复杂度为 O(1),避免了额外的空间开销。
  2. 效率高,每次只进行一次字符比较,比反转字符串的方法更直接且高效。

💯方法四:老师的第二种做法

思路

老师的第二种做法使用了标准库中的 reverse 函数,将字符串反转后直接与原字符串进行比较。这是一种简洁的做法,但其空间复杂度稍高,因为需要额外的存储空间来保存反转后的字符串。

代码实现

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;int main() {string s;cin >> s;string t = s;reverse(t.begin(), t.end());  // 反转字符串if (t == s) cout << "yes" << endl;elsecout << "no" << endl;return 0;
}

解析

  1. 字符串反转:利用 reverse 函数将字符串 s 反转,并保存到 t 中。
  2. 回文判断:通过直接比较反转后的字符串 t 和原字符串 s 是否相等来判断回文。

优点

  1. 代码简洁:通过标准库函数,代码更加简洁和易懂。
  2. 实现简单:使用 reverse 可以减少手动反转字符串的工作量。

缺点

  1. 空间复杂度为 O(n),因为需要额外的字符串 t 来存储反转后的字符串。

💯对比分析

  1. 空间复杂度

    • 我的第一种做法和老师的第一种做法都使用了 O(1) 空间,通过双指针来直接判断回文。
    • 我的第二种做法和老师的第二种做法需要额外的 O(n) 空间来存储反转后的字符串。
  2. 时间复杂度

    • 所有方法的时间复杂度均为 O(n),其中 n 是字符串的长度。
  3. 可读性与简洁性

    • 我的第二种做法和老师的第二种做法通过反转字符串,代码简单易懂。
    • 我的第一种做法和老师的第一种做法更加高效,避免了不必要的空间开销。

💯扩展:空间优化和实际应用

在一些实际应用中,空间的使用往往是一个重要的考虑因素。如果我们能够通过优化算法减少空间复杂度,将会使得程序更高效。双指针法就是在空间优化方面的一个典型例子,它避免了反转字符串时的额外存储。

💯小结

本文通过分析四种不同的做法来判断字符串是否为回文,比较了它们在空间和时间复杂度上的表现。通过这几种做法,我们可以发现,双指针法在空间和时间上的优势较为明显,是最为推荐的解决方案。当然,对于小规模的问题,使用字符串反转的做法也不失为一种简洁高效的选择。

希望本篇文章能够帮助大家更好地理解字符串回文判断的不同做法,并能够根据实际问题选择合适的算法。


在这里插入图片描述


在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

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

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

相关文章

ubuntuCUDA安装

系列文章目录 移动硬盘制作Ubuntu系统盘 前言 根据前篇“移动硬盘制作Ubuntu系统盘”安装系统后&#xff0c;还不能够使用显卡。 如果需要使用显卡&#xff0c;还需要进行相关驱动的安装&#xff08;如使用的为Nvidia显卡&#xff0c;就需要安装相关的Nvidia显卡驱动&#xff…

Selenium 使用指南:从入门到精通

Selenium 使用指南&#xff1a;从入门到精通 Selenium 是一个用于自动化 Web 浏览器操作的强大工具&#xff0c;广泛应用于自动化测试和 Web 数据爬取中。本文将带你从入门到精通地掌握 Selenium&#xff0c;涵盖其基本操作、常用用法以及一个完整的图片爬取示例。 1. 环境配…

Sqoop导入MySQL中含有回车换行符的数据

个人博客地址&#xff1a;Sqoop导入MySQL中含有回车换行符的数据 MySQL中的数据如下图&#xff1a; 检查HDFS上的目标文件内容可以看出&#xff0c;回车换行符位置的数据被截断了&#xff0c;导致数据列错位。 Sqoop提供了配置参数&#xff0c;在导入时丢弃掉数据的分隔符&…

利用matlab寻找矩阵中最大值及其位置

目录 一、问题描述1.1 max函数用法1.2 MATLAB中 : : :的作用1.3 ind2sub函数用法 二、实现方法2.1 方法一&#xff1a;max和find2.2 方法二&#xff1a;max和ind2sub2.3 方法对比 三、参考文献 一、问题描述 matlab中求最大值可使用函数max&#xff0c;对于一维向量&#xff0…

PyTorch数据建模

回归分析 import torch import numpy as np import pandas as pd from torch.utils.data import DataLoader,TensorDataset import time strat = time.perf_counter()

机试题——字符匹配

题目描述 给你一个字符串数组&#xff08;每个字符串均由小写字母组成&#xff09;和一个字符规律&#xff08;由小写字母和 . 和 * 组成&#xff09;&#xff0c;识别数组中哪些字符串可以匹配到字符规律上。 . 匹配任意单个字符。* 匹配零个或多个前面的那一个元素。 所谓…

《 C++ 点滴漫谈: 二十五 》空指针,隐秘而危险的杀手:程序崩溃的真凶就在你眼前!

摘要 本博客全面解析了 C 中指针与空值的相关知识&#xff0c;从基础概念到现代 C 的改进展开&#xff0c;涵盖了空指针的定义、表示方式、使用场景以及常见注意事项。同时&#xff0c;深入探讨了 nullptr 的引入及智能指针在提升代码安全性和简化内存管理方面的优势。通过实际…

git push到远程仓库时无法推送大文件

一、错误 remote: Error: Deny by project hooks setting ‘default’: size of the file ‘scientific_calculator’, is 164 MiB, which has exceeded the limited size (100 MiB) in commit ‘4c91b7e3a04b8034892414d649860bf12416b614’. 二、原因 本地提交过大文件&am…

掌握API和控制点(从Java到JNI接口)_36 JNI开发与NDK 04

4、 *.so的入口函数&#xff1a;JNI_OnLoad() VM (virtual machine)的角色 Java代码在VM上执行。在执行Java代码的过程中&#xff0c;如果Java需要与本地代码(*.so)沟通时&#xff0c; VM就会把*.so視为插件<Tn>而加载到VM里。然后让Java函数呼叫到这插件<Tn>里的…

Windows图形界面(GUI)-QT-C/C++ - QT Tab Widget

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 目录 一、概述 1.1 什么是 QTabWidget&#xff1f; 1.2 使用场景 二、常见样式 2.1 选项卡式界面 2.2 动态添加和删除选项卡 2.3 自定义选项卡标题和图标 三、属性设置 3.1 添加页面&…

[MRCTF2020]Ez_bypass1(md5绕过)

[MRCTF2020]Ez_bypass1(md5绕过) ​​ 这道题就是要绕过md5强类型比较&#xff0c;但是本身又不相等&#xff1a; md5无法处理数组&#xff0c;如果传入的是数组进行md5加密&#xff0c;会直接放回NULL&#xff0c;两个NuLL相比较会等于true&#xff1b; 所以?id[]1&gg…

90,【6】攻防世界 WEB Web_php_unserialize

进入靶场 进入靶场 <?php // 定义一个名为 Demo 的类 class Demo { // 定义一个私有属性 $file&#xff0c;默认值为 index.phpprivate $file index.php;// 构造函数&#xff0c;当创建类的实例时会自动调用// 接收一个参数 $file&#xff0c;用于初始化对象的 $file 属…

Jenkins安装部署(以及常见报错解决方案),jdk版本控制器sdkman

目录 零、环境介绍 一、Jenkins安装 1、插件安装以及更换插件源 2、修改jenkins时区 二、sdkman安装&#xff08;可选&#xff09; 1、sdkman常用方法 2、sdkman常用方法演示 2.1、查看可用的jdk 2.2、下载jdk并切换版本 三、jenkins报错解决 1、下载sdkman后systemc…

大数据挖掘--两个角度理解相似度计算理论

文章目录 0 相似度计算可以转换成什么问题1 集合相似度的应用1.1 集合相似度1.1文档相似度1.2 协同过滤用户-用户协同过滤物品-物品协同过滤 1.2 文档的shingling--将文档表示成集合1.2.1 k-shingling1.2.2 基于停用词的 shingling 1.3 最小哈希签名1.4 局部敏感哈希算法&#…

关于贪心学习的文笔记录

贪心&#xff0c;顾名思义就是越贪越好&#xff0c;越多越有易&#xff0c;他给我的感觉是&#xff0c;通常是求最大或最小问题&#xff0c;相比于动态规划贪心让人更加琢磨不透&#xff0c;不易看出方法&#xff0c;为此在这记录我所见过的题型和思维方法&#xff0c;以便回头…

c语言练习题【数据类型、递归、双向链表快速排序】

练习1&#xff1a;数据类型 请写出以下几个数据的数据类型 整数 a a 的地址 存放a的数组 b 存放a的地址的数组 b的地址 c的地址 指向 printf 函数的指针 d 存放 d的数组 整数 a 的类型 数据类型是 int a 的地址 数据类型是 int*&#xff08;指向 int 类型的指针&#xff09; …

联想拯救者Y9000P IRX8 2023 (82WK) 原厂Win11 家庭中文版系统 带一键还原功能 安装教程

安装完重建winre一键还原功能&#xff0c;和电脑出厂时的系统状态一模一样。自动机型专用软件&#xff0c;全部驱动&#xff0c;主题壁纸&#xff0c;自动激活&#xff0c;oem信息等。将电脑系统完全恢复到出厂时状态。 支持机型 (MTM) : 82WK 系统版本&#xff1a;Windows 1…

搜索与图论复习2最短路

单源最短路---所有边权是正数(Dijkstra算法O(n^2)--稠密图(邻接矩阵)和堆优化的Dijkstra算法O(mlogn)--稀疏图(邻接表)) 或存在负边权(Bellman-ford贝尔曼福特算法O(nm)和SPFA一般O(m) 最坏O(nm) ) 多源最短路---Floyd算法O(n^3) 一、迪杰斯特拉算法(Dijkstra)&#xff1a;1…

Unity GetLocalizedString()失效问题

问题&#xff1a; 在一个自定义类中调用GetLocalizedString()的方法&#xff0c;是无效的&#xff08;创建这个自定义类的脚本没挂载到场景中&#xff09;。 解决方法: 将自定义类的GetLocalizedString()方法换个地方&#xff0c;换到在场景中挂载的一个脚本实例&#xff08;…

【建站】专栏目录

建站专栏的想法有很多&#xff0c;想写穷鬼如何快速低成本部署前后端项目让用户能访问到&#xff0c;如何将网站收录到百度&#xff0c;bing&#xff0c;google并优化seo让搜索引擎搜索到网站&#xff0c;想写如何把网站加入google广告或者接入stripe信用卡首款平台收款&#x…