【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.pswp.cn/web/67859.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/67859.shtml
英文地址,請注明出處:http://en.pswp.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…