题目要求
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 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>
解题过程
- 接收数据之后首先要判断数据合法性
- 判断指向字符是否为字母或数字,是则进行下一个判断。否则循环变量改变,跳过该次判断,进行下一个判断。
- 当头尾指针都是字母或数字时,可以开始对比是否相同。相同则循环变量改变,进行下一个循环。否则返回0(false)并退出循环(代表该字符串不为回文串)
- 如果循环没有退出,全部执行完成。这即代表该字符串为回文串,可以返回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 查看本文章