最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++實(shí)現(xiàn)回文串判斷的兩種高效方法

 更新時(shí)間:2025年03月03日 16:46:04   作者:倔強(qiáng)的石頭_  
文章介紹了兩種判斷回文串的方法:解法一通過創(chuàng)建新字符串來處理,解法二在原字符串上直接篩選判斷,兩種方法都使用了雙指針法,文中通過代碼示例講解的非常詳細(xì),需要的朋友可以參考下

一、問題描述

在字符串處理中,判斷一個(gè)字符串是否為回文串是一個(gè)經(jīng)典問題。

本題有特殊要求:在將所有大寫字符轉(zhuǎn)換為小寫字符、并移除所有非字母數(shù)字字符之后,如果短語正著讀和反著讀都一樣,則認(rèn)為該短語是一個(gè)回文串。字母和數(shù)字都屬于字母數(shù)字字符。

示例

  • 輸入: s = "A man, a plan, a canal: Panama",輸出:true,解釋:處理后得到 "amanaplanacanalpanama" 是回文串。
  • 輸入:s = "race a car",輸出:false,解釋:處理后得到 "raceacar" 不是回文串。
  • 輸入:s = " ",輸出:true,解釋:移除非字母數(shù)字字符后,s 是一個(gè)空字符串 "",空字符串正著反著讀都一樣,所以是回文串。

 原題鏈接 

125. 驗(yàn)證回文串 - 力扣(LeetCode)

二、解法一:將字母數(shù)字連接到新的 string

思路

這種方法的核心思想是先遍歷原字符串,把其中的字母數(shù)字字符提取出來,同時(shí)將大寫字母轉(zhuǎn)換為小寫字母,存儲(chǔ)到一個(gè)新的字符串 tmp 中

然后再對(duì)新字符串 tmp 進(jìn)行回文判斷

代碼實(shí)現(xiàn)

#include <iostream>
#include <string>
 
class Solution {
public:
    bool isPalindrome(string s) //第一種方式 將字母數(shù)字連接到新的string
    {
        string tmp;
        string::iterator left = s.begin();
        string::iterator right = s.end();
 
        while (left != right)//第一次遍歷,所有字母數(shù)字轉(zhuǎn)入新string,并且統(tǒng)一為小寫
        {
            if ((*left >= '0' && *left <= '9') || (*left >= 'a' && *left <= 'z'))
                tmp += *left;
            if (*left >= 'A' && *left <= 'Z')
                tmp += (*left + 32);
            ++left;
        }
 
        if (tmp.empty())//如果新string為空,則判定為回文串
            return true;
 
        left = tmp.begin();
        right = tmp.end() - 1;
        while (left <= right)//第二次遍歷 左右迭代器逐個(gè)對(duì)比
        {
            if (*left == *right)
            {
                ++left;
                --right;
            }
            else
                return false;
        }
        return true;
    }
};

代碼解釋

  1. 提取字母數(shù)字并轉(zhuǎn)換大小寫
    • 定義一個(gè)空字符串 tmp 用于存儲(chǔ)處理后的字符。
    • 使用迭代器 left 遍歷原字符串 s,當(dāng)遇到數(shù)字('0' 到 '9')或小寫字母('a' 到 'z')時(shí),直接添加到 tmp 中;當(dāng)遇到大寫字母('A' 到 'Z')時(shí),將其 ASCII 碼值加 32 轉(zhuǎn)換為小寫字母后添加到 tmp 中。
  2. 處理空字符串情況:如果 tmp 為空字符串,根據(jù)題目定義,空字符串是回文串,直接返回 true。
  3. 回文判斷:使用雙指針法,left 指向 tmp 的開頭,right 指向 tmp 的結(jié)尾,逐個(gè)比較對(duì)應(yīng)位置的字符。如果不相等,返回 false;如果都相等,最終返回 true。

復(fù)雜度分析

  • 時(shí)間復(fù)雜度:O(n)需要遍歷原字符串一次,再遍歷新字符串一次。
  • 空間復(fù)雜度:O (n),其中  n是處理后新字符串的長度。

三、解法二:直接原地篩選判斷

思路

這種方法不創(chuàng)建新的字符串,而是直接在原字符串上使用雙指針法進(jìn)行篩選和判斷。通過兩個(gè)指針 left 和 right 分別從字符串的兩端開始向中間移動(dòng),跳過非字母數(shù)字字符,同時(shí)將字符轉(zhuǎn)換為小寫后進(jìn)行比較。

代碼實(shí)現(xiàn)

#include <iostream>
#include <string>
#include <cctype>
 
class Solution {
public:
    bool isPalindrome(std::string s) //第二種方式,直接原地篩選判斷
    {
        string::iterator left = s.begin();
        string::iterator right = s.end() - 1;
 
        while (left < right)
        {
            // 跳過左邊的非字母數(shù)字字符
            while (left < right && !isalnum(*left))
            {
                ++left;
            }
            // 跳過右邊的非字母數(shù)字字符
            while (left < right && !isalnum(*right))
            {
                --right;
            }
 
            if (left < right) {
                // 將字符轉(zhuǎn)換為小寫后比較
                if (tolower(*left) != tolower(*right))
                {
                    return false;
                }
                ++left;
                --right;
            }
        }
        //跳出循環(huán),要么left==right,要么left>right 
        //說明所有需要比較的字符對(duì)都已經(jīng)檢查過,且都相等
        return true;
    }
};

代碼解釋

  1. 初始化指針:使用迭代器 left 指向字符串的開頭,right 指向字符串的結(jié)尾。
  2. 跳過非字母數(shù)字字符:通過兩個(gè)內(nèi)層 while 循環(huán),分別將 left 和 right 指針移動(dòng)到字母數(shù)字字符的位置。
  3. 字符比較:將 left 和 right 指針指向的字符轉(zhuǎn)換為小寫后進(jìn)行比較,如果不相等,返回 false;如果相等,繼續(xù)移動(dòng)指針。
  4. 返回結(jié)果:當(dāng) left 大于等于 right 時(shí),說明所有需要比較的字符對(duì)都已經(jīng)檢查過,且都相等,返回 true。

復(fù)雜度分析

  • 時(shí)間復(fù)雜度:O(n),只需要遍歷一次字符串。
  • 空間復(fù)雜度:O(1),只使用了常數(shù)級(jí)的額外空間。

總結(jié)

兩種解法都能有效解決回文串判斷問題:

解法一邏輯清晰,易于理解,但需要額外的空間存儲(chǔ)處理后的字符串;

解法二原地操作,空間復(fù)雜度更低,更適合處理大規(guī)模數(shù)據(jù)。在實(shí)際應(yīng)用中,可以根據(jù)具體需求選擇合適的解法。

以上就是C++實(shí)現(xiàn)回文串判斷的兩種高效方法的詳細(xì)內(nèi)容,更多關(guān)于C++回文串判斷的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Matlab實(shí)現(xiàn)繪制玫瑰線的示例代碼

    Matlab實(shí)現(xiàn)繪制玫瑰線的示例代碼

    這篇文章主要為大家介紹了如何利用Matlab繪制3好看的玫瑰線,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Matlab有一定幫助,感興趣的小伙伴可以動(dòng)手試一試
    2022-08-08
  • C++中String增刪查改模擬實(shí)現(xiàn)方法舉例

    C++中String增刪查改模擬實(shí)現(xiàn)方法舉例

    這篇文章主要給大家介紹了關(guān)于C++中String增刪查改模擬實(shí)現(xiàn)方法的相關(guān)資料,String是C++中的重要類型,程序員在C++面試中經(jīng)常會(huì)遇到關(guān)于String的細(xì)節(jié)問題,甚至要求當(dāng)場實(shí)現(xiàn)這個(gè)類,需要的朋友可以參考下
    2023-11-11
  • 淺談C++ 中的常見的動(dòng)態(tài)內(nèi)存問題

    淺談C++ 中的常見的動(dòng)態(tài)內(nèi)存問題

    C++動(dòng)態(tài)內(nèi)存管理容易引發(fā)多種嚴(yán)重問題,包括內(nèi)存泄漏、重復(fù)釋放、釋放后使用、new/delete不匹配、未初始化內(nèi)存、越界訪問和異常安全問題,下面就來介紹一下常見的問題,感興趣的可以了解一下
    2026-01-01
  • C/C++ Crypto密碼庫調(diào)用的實(shí)現(xiàn)方法

    C/C++ Crypto密碼庫調(diào)用的實(shí)現(xiàn)方法

    Crypto 庫是C/C++的加密算法庫,這個(gè)加密庫很流行,基本上涵蓋了市面上的各類加密解密算法,感興趣的可以參考一下
    2021-06-06
  • C指針原理教程之C指針基礎(chǔ)

    C指針原理教程之C指針基礎(chǔ)

    指針是一個(gè)特殊的變量,它里面存儲(chǔ)的數(shù)值被解釋成為內(nèi)存里的一個(gè)地址。要搞清一個(gè)指針需要搞清指針的四方面的內(nèi)容:指針的類型、指針?biāo)赶虻念愋?、指針的值或者叫指針?biāo)赶虻膬?nèi)存區(qū)、指針本身所占據(jù)的內(nèi)存區(qū)。
    2019-02-02
  • C語言隨機(jī)數(shù)生成教程(rand和srand用法)

    C語言隨機(jī)數(shù)生成教程(rand和srand用法)

    這篇文章主要介紹了C語言隨機(jī)數(shù)生成教程(rand和srand用法),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • C語言中如何在結(jié)構(gòu)體內(nèi)定義函數(shù)

    C語言中如何在結(jié)構(gòu)體內(nèi)定義函數(shù)

    這篇文章主要介紹了C語言中如何在結(jié)構(gòu)體內(nèi)定義函數(shù)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C++實(shí)現(xiàn)map和set封裝詳解

    C++實(shí)現(xiàn)map和set封裝詳解

    歡迎閱讀本指南,將帶您深入了解C++中map和set的實(shí)現(xiàn)細(xì)節(jié),本文將重點(diǎn)介紹如何使用C++標(biāo)準(zhǔn)庫中的容器來優(yōu)化代碼,同時(shí)提供實(shí)用的示例和技巧,無論您是初學(xué)者還是資深開發(fā)者,本指南都將成為您掌握C++中map和set封裝的有力助手,需要的朋友可以參考下
    2024-03-03
  • 淺談char*類型返回值和字符串常量

    淺談char*類型返回值和字符串常量

    下面小編就為大家?guī)硪黄獪\談char*類型返回值和字符串常量。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-12-12
  • C語言實(shí)現(xiàn) 數(shù)據(jù)類型占多少字節(jié)指針占多少字節(jié)

    C語言實(shí)現(xiàn) 數(shù)據(jù)類型占多少字節(jié)指針占多少字節(jié)

    這篇文章主要介紹了 C語言 數(shù)據(jù)類型占多少字節(jié)指針占多少字節(jié)的實(shí)例代碼,代碼簡單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09

最新評(píng)論

八宿县| 航空| 关岭| 秀山| 玉田县| 会昌县| 旬阳县| 金坛市| 泰安市| 双峰县| 永登县| 邵武市| 麻江县| 普定县| 呈贡县| 马尔康县| 佛坪县| 饶阳县| 南投市| 天镇县| 大城县| 永仁县| 湘潭市| 建昌县| 行唐县| 双桥区| 天等县| 盱眙县| 福海县| 甘泉县| 宾阳县| 西乌珠穆沁旗| 阳原县| 沙雅县| 禹州市| 大港区| 岫岩| 沙湾县| 清远市| 浮山县| 刚察县|