【题解】验证回文串

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

示例 1:

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

示例 2:

输入: "race a car"
输出: false

解题思路
1、这道题目要求判断字符串是否为回文串,回文串的意思是这个字符串从头读和从尾读都是一样的(如同摘要一样)。
2、并且题目说明了,空字符也算是有效的回文串,所以等一下我们也要判断字符串是否为空。
3、这里要说明一下NULL 和空字符的区别:

  • NULL 表示声明的是一个空对象,可以赋给任何对象。
  • 但是空字符是占有一块空字符空间,代表了一个对象实例。

4、我们会用到三个额外函数

  • strlen() 用来取出字符串的长度,头文件<string.h>;
  • isalnum() 用来判断字符是否为数字或字母,是则返回0,否则返回1;
  • tolower() 将字母转换成小写,isalnum() 和tolower() 的头文件都为<ctype.h>

解题过程

  1. 接收数据之后首先要判断数据合法性
  2. 判断指向字符是否为字母或数字,是则进行下一个判断。否则循环变量改变,跳过该次判断,进行下一个判断。
  3. 当头尾指针都是字母或数字时,可以开始对比是否相同。相同则循环变量改变,进行下一个循环。否则返回0(false)并退出循环(代表该字符串不为回文串)
  4. 如果循环没有退出,全部执行完成。这即代表该字符串为回文串,可以返回1(true)

该代码在力扣编译器提交

bool isPalindrome(char * str){
    
    
    int i, n;

    //1、判断数据合法性
    if(str == NULL)
        return 0;
    else if(strlen(str) == 0)
        return 1;

    n = strlen(str) - 1;

    for(i = 0; i < n;){
    
    
    //2、判断字符是否为数字或字母,否则跳过
        if(!isalnum(str[i])){
    
       //头部判断,并向后移
            i++;
            continue;
        }
        if(!isalnum(str[n])){
    
       //尾部判断,并向前移
            n--;
            continue;
        }

    //3、如果字符为数字或字母,则判断是否相同。否则返回0(退出程序)
        if(tolower(str[i]) != tolower(str[n]))
            return 0;
        //更新循环条件
        i++;
        n--;
    }
    //4、当循环完成时,代表字符串为回文串
    return 1;
}

这里要说明一下,因为C 语言里面没有bool 类型,所以我们可以用 0或1 来代替。


本地编译器类型,通过main() 函数来调用。其实也只是加了头文件和返回值判断输出而已。

#include <stdio.h>
#include <string.h>    //为函数strlen() 提供原型
#include <ctype.h>    //为函数isalnum() 和tolower() 提供原型

int isPalindrome(char* str);

int main(void){
    
    
    char* str = "A man, a plan,x a canal: Panama";

    if(isPalindrome(str))
        printf("%s", "true");
    else
        printf("%s", "flase");

    return 0;
}

int isPalindrome(char* str){
    
    
    int i, n;

    //1、判断数据合法性
    if(str == NULL)
        return 0;
    else if(strlen(str) == 0)
        return 1;

    n = strlen(str) - 1;

    for(i = 0; i < n;){
    
    
    //2、判断字符是否为数字或字母,否则跳过
        if(!isalnum(str[i])){
    
       //头部判断,并向后移
            i++;
            continue;
        }
        if(!isalnum(str[n])){
    
       //尾部判断,并向前移
            n--;
            continue;
        }

    //3、如果字符为数字或字母,则判断是否相同。否则返回0(退出程序)
        if(tolower(str[i]) != tolower(str[n]))
            return 0;
        i++;
        n--;
    }
    //4、当循环完成时,代表字符串为回文串
    return 1;
}

本月更新进度 3/15

创作不易,你的点赞是我最大的动力!!!
我们下次再见 end~

扫描二维码关注公众号,回复: 12271043 查看本文章

猜你喜欢

转载自blog.csdn.net/weixin_43776724/article/details/106874272