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

【5.8】指针算法-双指针验证回文串

一、题目

        给定一个字符串,验证它是否是回文串, 只考虑字母和数字字符 ,可以忽略字母的大小写。
说明: 本题中,我们将空字符串定义为有效的回文串。

示例 1:
输入: "A man , a plan , a canal : Panama "
输出: true


示例 2:
输入: "race a car"
输出: false

二、解题思路

        “回文串” 指的是正读和反读都相同的字符串,即其左右两边呈对称状态。要验证一个字符串是否为回文串,一种最简单的方式就是运用两个指针,一个从字符串前端开始,一个从后端开始,两个指针同时向中间移动。如果它们指向的字符不一样,那么这个字符串肯定不是回文字符串,直接返回 false 即可;如果这两个指针相遇了,那就直接返回 true。不过这道题只需要判断字母和数字,因为字符串中可能含有其他字符,对于这些其他字符我们只需跳过即可。下面画个图来看一下。

三、代码实现

#include <iostream>
#include <string>
#include <cctype>

using namespace std;

bool isPalindrome(string s) {
    int left = 0, right = s.length() - 1;
    while (left < right) {
        // left是左指针,如果不是字母和数字要过滤掉
        while (left < right && !isalnum(s[left]))
            left++;
        // right也一样,如果不是字母和数字也要过滤掉
        while (left < right && !isalnum(s[right]))
            right--;
        // 然后判断这两个字符是否相同,如果不相同直接返回false,这里是先把字符全部转化为小写
        if (tolower(s[left]) != tolower(s[right]))
            return false;
        // 如果left和right指向的字符忽略大小写相等的话,这两个指针要分别往中间移一步
        left++;
        right--;
    }
    // 如果都比较完了,说明是回文串,返回true
    return true;
}

int main() {
    string s = "A man, a plan, a canal: Panama";
    bool result = isPalindrome(s);

    // 打印结果
    cout << "Input: \"" << s << "\"" << endl;
    cout << "Output: " << (result ? "true" : "false") << endl;

    return 0;
}
        我们还可以在比较之前字母全部转化为小写,最外层改为for 循环的方式

#include <iostream>
#include <string>
#include <algorithm>
#include <cctype>

bool isPalindrome(std::string s) {
    // 先转为小写
    std::transform(s.begin(), s.end(), s.begin(), ::tolower);

    // 双指针法
    int i = 0, j = s.length() - 1;
    while (i < j) {
        // 跳过非字母和数字的字符
        while (i < j && !std::isalnum(s[i]))
            i++;
        while (i < j && !std::isalnum(s[j]))
            j--;

        // 比较字符
        if (s[i] != s[j])
            return false;

        // 移动指针
        i++;
        j--;
    }
    return true;
}

int main() {
    std::string s = "A man, a plan, a canal: Panama";
    std::cout << std::boolalpha << isPalindrome(s) << std::endl;  // 输出: true
    return 0;
}


http://www.kler.cn/a/382323.html

相关文章:

  • 【FL0013】基于SpringBoot和微信小程序的机电公司管理信息系统
  • AnatoMask的分层图像编码器-解码器
  • Linux /proc/[pid]/task/[tid]/sched文件解析
  • 安全关键型嵌入式系统设计模式整理及应用实例
  • HarmonyOS使用arkTS拉起指定第三方应用程序
  • 知乎信息流广告推广开户流程及攻略!
  • 小语言模型介绍与LLM的比较
  • 【d63】【Java】【力扣】141.训练计划III
  • MFC,DLL界面库设计注意
  • 基于uniapp和java的电动车智能充电系统软件平台的设计
  • html checkbox和label 文字不对齐解决办法
  • 某华迪加现场大屏互动系统mobile.do.php任意文件上传
  • windows安装mysql
  • Android 依赖统一配置管理(Version Catalogs)
  • 学习党的二十大精神,推动科技创新和发展
  • Spring中的资源Resource 以及分类(多种资源的实现类)
  • Follow软件的使用入门教程
  • PostgreSQL 字段按逗号分隔成多条数据的技巧与实践 ️
  • ClickHouse创建账号和连接测试
  • 【LeetCode】【算法】338. 比特位计数
  • TS-AWG控制电光调制器:推动科技应用新发展的利器
  • 一个.NET开源、轻量级的运行耗时统计库 - MethodTimer
  • Allegro: 开源的高级视频生成模型
  • 服务器的配置复杂,租用时该如何选择参数?
  • 数据库->索引
  • 入门车载以太网(3) -- 网络层