LeetCode- 125. Valid Palindrome


Description

Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases.

For example,
“A man, a plan, a canal: Panama” is a palindrome.
“race a car” is not a palindrome.

Note:
Have you consider that the string might be empty? This is a good question to ask during an interview.
For the purpose of this problem, we define empty string as valid palindrome.

题目分析

本题中要求对于一给定字符串,判断其是否属于回文(palindrome),所谓回文是指顺读和倒读都一样的词语。题目中要求判断的内容仅包含数字和字母两种字符,标点符号不属于判断内容。如

example1:
strs1="A man, a plan, a canal: Panama"
output:true

example2 :
strs2="race a car"
output:false

字符串strs1中除标点符号外的字符顺读与倒读均相同(忽略字幕大小写),er字符串strs2中顺读与倒读不一致,故输出false。

解题思路
所谓回文是指顺读和倒读均相同的字符串,因此属于回文的字符串必定左右对称。我们只需要判定所给的字符串是否左右对称即可解决问题。
由于,所给字符串中可能包含标点符号,而标点符号不在判断之列,因此第一步需要将字符串中的标点符号去掉,只留下字母和数字;由于所给字符串中的字母是大小写混合存在,第二步,将字符串中的字母化为同一,或全为大写,或全小写;第三步,判断字符是否左右对称,若发现一个位置不对称,则输出false,若全部对称,输出true。
特殊情况:
(1)空字符串(“”)。对于空字符串,认为其属于回文,输出true。
(2)字符串中仅含有一个字符。单个字符与其本身对称,也属于回文,因此输出true。
C语言代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h> 

bool isPalindrome(char* strs) {
    int len=strlen(strs);
    bool flag=false;
    int i=0,j=0;
    if (len==0 || len==1)                                      //长度为1或0 
        return true;

    char string[len];

    while(strs[i]!='\0')
    {
        if('A'<=strs[i] && strs[i]<='Z')                        //大写变为小写 
        {
            string[j]=strs[i]+'a'-'A';
            j=j+1;
        }
         if(('a'<=strs[i] && strs[i]<='z') ||
                             ('0'<=strs[i] && strs[i]<='9') )   //小写字母与数字不做变换

        {
            string[j]=strs[i];
            j++;    
        }

        i++;
    }
    string[j]='\0';                                             //末尾加‘\0’,提高运行速度 
    for(i=0;i<j/2;i++)                                         //判断是否左右对称,最多只需判断其长度的一般 
    {
        if(string[i]!=string[j-i-1])                           //找到一个不一致,说明不对称,结束 
            break;
    }
    if(i==j/2)                                                 //所有对应位都相同,即说明左右对称 
        flag=true;
    return flag;
}

int main()
{
    char *strs="ab";
    bool flag;
    flag=isPalindrome(strs);
    printf("%d",flag);

    return 0;
}

对于字符串,C语言中是以数组(字符数组)的形式存放,数组元素的类型为char,其长度为1个字节。因而字符指针指向存放该字符串的数组地址。字符指针的字面量表示存放该字符串的数组的首个元素的地址。对于指针变量进行加减操作,相当于奖赏这个整数和指针数据类型对应字节数的乘积。
对于字符指针,由于其指向字符串的首地址,其对应的数据类型为char,数据长度为1,因此指针字符加一,相当于地址加一,因此可以通过指针加一来访问字符串的单个字符。本题也可以通过指针加一的方式来访问字符串的各个字符。

bool isPalindrome(char* strs) {
    int len=strlen(strs);
    bool flag=false;
    int i=0,j=0;
    if (len==0 || len==1)                                         //长度为1或0 
        return true;

    char string[len];

    while(*strs!='\0')                                             //strs代表首地址,*解引用就表示单个字符
    {
        if('A'<=*strs && *strs<='Z')                        //大写变为小写 
        {
            string[j]=*strs+'a'-'A';
            j=j+1;
        }
         if(('a'<=*strs && *strs<='z') ||
                             ('0'<=*strs && *strs<='9') )   //小写字母与数字不做变换                                     
        {
            string[j]=*strs;
            j++;    
        }

        strs++;
    }
    string[j]='\0';                                             //末尾加‘\0’,提高运行速度 
    for(i=0;i<j/2;i++)                                         //判断是否左右对称,最多只需判断其长度的一般 
    {
        if(string[i]!=string[j-i-1])                           //找到一个不一致,说明不对称,结束 
            break;
    }
    if(i==j/2)                                                 //所有对应位都相同,即说明左右对称 
        flag=true;
    return flag;
}

参考文献
[1] https://leetcode.com/submissions/detail/110747419/
[2] 《深入理解C指针》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值