2023年7月2日leetcode每日一题打卡——125.验证回文串

这篇具有很好参考价值的文章主要介绍了2023年7月2日leetcode每日一题打卡——125.验证回文串。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、题目描述与要求

125. 验证回文串 - 力扣(LeetCode)

题目描述

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

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

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

示例

示例1:

输入: s = "A man, a plan, a canal: Panama"
输出:true
解释:"amanaplanacanalpanama" 是回文串。

示例2:

输入:s = "race a car"
输出:false
解释:"raceacar" 不是回文串。

 示例3:

输入:s = " "
输出:true
解释:在移除非字母数字字符之后,s 是一个空字符串 "" 。
由于空字符串正着反着读都一样,所以是回文串。

提示

  • 1 <= s.length <= 2 * 105
  • s 仅由可打印的 ASCII 字符组成

二、解题思路

总的思路:

       首先根据题目要求可以有两种大的解题方法:一是对数组本身进行修改,将其改成要进行判断的形式然后判断其是否为回文串;二是利用双指针的方式,对于要排除的字符选择跳过,以此来判断整个字符串是否为回文串。【下面提到的下标变量指的是用来指示下标的整型变量】

       对于第一种方法,则需要我们首先将数组中的所有大写字符都转成小写字符,其实也就是26个字母的大写转成小写,利用“ch=ch+32”即可实现。然后就是将数组中所有非字母数字字符进行移除,也就是删去除字母和数字以外的其他字符,可以利用覆盖的思想,在每次找到非字母数字字符时将后面所有字符往前覆盖,覆盖只需要利用到一个下标变量(时间较长)。也可以使用两个下标变量,一个用来遍历整个数组,另一个用来记录修改后的数组。然后就是直接对修改后的数组首尾字符进行比较来判断其是否为回文串。

       对于第二种方法,则需要我们设置一个判定条件,即只有当两个字符都是字母或者数字才对其进行比较,一旦有一方不是,则需要寻找下一个字符用来比较,也就是所谓的“跳过”。这一方法需要利用到“双指针”,也就是两个下标变量。两方都是的情况下则只需要修改大写字母为小写,然后进行判断是否相同,相同则移动指针继续比较直至遍历结束/发现不是回文串则结束。【在实现这一方法的过程中,就是判断字符是否是字母/数字字符的代码比较长,看起来很乱,因而可以选择将其单独写成一个函数】【修改大写字母为小写可以在判断字符前把整个数组都进行修改,也可以在判断后在对其进行修改】

2023年7月2日leetcode每日一题打卡——125.验证回文串,leetcode刷题,leetcode,算法,职场和发展,c语言

具体步骤:

方法一:

①遍历数组,将大写字符全部转换成小写字符

②将数组中所有非字母数字字符进行移除【可以分为利用几个下标变量】

③获取数组长度

④判断修改后的字符串是否为回文串

方法二:

①获取数组长度

②将数组中的所有大写字符转成小写字符

③判断首尾字符是否为字母数字字符,并判断是否相等,然后移动指针,直至获得结果文章来源地址https://www.toymoban.com/news/detail-521147.html


三、具体代码【C语言】

①只采用一个下标变量来对数组进行修改(覆盖)【超时,但步骤清晰,可用于理解】

bool isPalindrome(char* s) {
    int i = 0, j = 0;
    for (int i = 0; s[i] != '\0'; i++) { //遍历数组,将大写字符全部转换成小写字符
        if (s[i] >= 'A' && s[i] <= 'Z') {
            s[i] += 32;
        }

    }
    while (s[i] != '\0') {
        if ((s[i] >= '0' && s[i] <= '9') || (s[i] >= 'a' && s[i] <= 'z')) //是数字或者字母字符 访问下一个
        {
            i++;
        }
        else { //不是数字或者字符 覆盖并继续检查
            for (j = i; s[j] != '\0'; j++) {
                s[j] = s[j + 1];
            }
            s[j - 1] = '\0';//此时j-1指向最后一个字符的后面第一位
        }
    }
    int len = strlen(s);
    //k=j-2是因为,数组下标从0开始,j-1是结束符的下标,j-2就是最后一个字符的下标
    for (int i = 0, k = len - 1; i < k; i++) {
        if (s[i] != s[k])
            return false;
        else k--;
    }
    return true;
}

②对①进行修改,即利用两个下标变量来实现数组的修改【大写改小写与覆盖同时进行】【最快】

bool isPalindrome(char* s) {
    int i = 0, j = 0;
    for (int i = 0; s[i] != '\0'; i++) { //遍历数组,将大写字符全部转换成小写字符
        if (s[i] >= 'A' && s[i] <= 'Z') {
            s[j++] = s[i] + 32;
        }
        else if ((s[i] >= '0' && s[i] <= '9') || (s[i] >= 'a' && s[i] <= 'z')) {
            s[j++] = s[i];
        }
    }
    //此时j指向调整后的数组的结束符
    for (int i = 0, k = j - 1; i < k; i++) {
        if (s[i] != s[k])
            return false;
        else k--;
    }
    return true;
}

③不对数组进行修改,直接进行比较

bool Judge(char ch) {
    if ( (ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9')) {
        return true;
    }
    else {
        return false;
    }
}

bool isPalindrome(char * s){
    int j=strlen(s)-1;
    for(int i=0;s[i]!='\0';i++){ //遍历数组,将大写字符全部转换成小写字符
        if (s[i] >= 'A' && s[i] <= 'Z')  s[i]+=32;
    }
    for (int i = 0; s[i]!='\0'; i++) { 
        while(i<j){
            if(Judge(s[i])&&Judge(s[j])){
               if(s[i]!=s[j])  return false;
               i++; j--;
            }
            else if(!Judge(s[i])){
            i++;
            }
            else{
            j--;
            }
        }
    }
    return true;
}

 

到了这里,关于2023年7月2日leetcode每日一题打卡——125.验证回文串的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [LeetCode - Python]167.两数之和 II (Medium);125. 验证回文串(Easy)

    167.两数之和 II (Medium) 125. 验证回文串(Easy) 1.自己第一次写: 2.看题解

    2024年02月14日
    浏览(44)
  • ( 字符串) 647. 回文子串 ——【Leetcode每日一题】

    难度:中等 给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个序列。 具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串

    2024年02月01日
    浏览(45)
  • ( 动态规划) 516. 最长回文子序列 ——【Leetcode每日一题】

    难度:中等 给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。 子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。 示例 1: 输入:s = “bbbab” 输出:4 解释:一个可能的最长回文子序列为 “bbbb” 。 示例

    2024年02月06日
    浏览(44)
  • LeetCode·每日一题·1177. 构建回文串检测·前缀和

    作者:小迅 链接:https://leetcode.cn/problems/can-make-palindrome-from-substring/solutions/2309940/qian-zhui-he-zhu-shi-chao-ji-xiang-xi-by-n3ps/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。   题意 - 给定一个字符串,选择其中任意位置 L-R,可以重

    2024年02月09日
    浏览(41)
  • (动态规划) 132. 分割回文串 II ——【Leetcode每日一题】

    难度:困难 给你一个字符串 s ,请你将 s 分割成一些子串,使每个子串都是回文。 返回符合要求的 最少分割次数 。 示例 1: 输入:s = “aab” 输出:1 解释:只需一次分割就可将 s 分割成 [“aa”,“b”] 这样两个回文子串。 示例 2: 输入:s = “a” 输出:0 示例 3: 输入:

    2024年02月15日
    浏览(46)
  • 【五一创作】( 字符串) 409. 最长回文串 ——【Leetcode每日一题】

    难度:简单 给定一个包含大写字母和小写字母的字符串 s ,返回 通过这些字母构造成的 最长的回文串 。 在构造过程中,请注意 区分大小写 。比如 \\\"Aa\\\" 不能当做一个回文字符串。 示例 1: 输入:s = “abccccdd” 输出:7 解释: 我们可以构造的最长的回文串是\\\"dccaccd\\\", 它的长度是

    2024年02月01日
    浏览(57)
  • 125.验证回文串

    目录 一、题目 二、代码 125. 验证回文串 - 力扣(LeetCode)

    2024年02月14日
    浏览(63)
  • 【LeetCode每日一题】——946.验证栈序列

    栈 中等 946.验证栈序列 给定 pushed 和 popped 两个序列,每个序列中的 值都不重复,只有当它们可能是在最初空栈上进行的推入 push 和弹出 pop 操作序列的结果时,返回 true;否则,返回 false 。 示例 1: 输入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1] 输出:true 解释:我们可以按以下顺

    2024年02月15日
    浏览(35)
  • LeetCode 每日一题 2023/7/24-2023/7/30

    记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步 7/24 771. 宝石与石头 将宝石类型放入set中 一次判断石头中宝石个数 7/25 2208. 将数组和减半的最少操作次数 大顶堆记录当前最大值 每次取最大值减半 7/26 2569. 更新数组后处理求和查询

    2024年02月15日
    浏览(49)
  • LeetCode 每日一题 2023/8/14-2023/8/20

    记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步 8/14 617. 合并二叉树 dfs深搜 8/15 833. 字符串中的查找与替换 op存放该位置能替换的数值 从头遍历每个位置 8/16 2682. 找出转圈游戏输家 模拟 8/17 1444. 切披萨的方案数 动态规划 dp[k][i][j] 表

    2024年02月12日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包