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),所謂回文是指順讀和倒讀都一樣的詞語。題目中要求判斷的內容僅包含數(shù)字和字母兩種字符,標點符號不屬于判斷內容。如

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

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

字符串strs1中除標點符號外的字符順讀與倒讀均相同(忽略字幕大小寫),er字符串strs2中順讀與倒讀不一致,故輸出false。

解題思路
所謂回文是指順讀和倒讀均相同的字符串,因此屬于回文的字符串必定左右對稱。我們只需要判定所給的字符串是否左右對稱即可解決問題。
由于,所給字符串中可能包含標點符號,而標點符號不在判斷之列,因此第一步需要將字符串中的標點符號去掉,只留下字母和數(shù)字;由于所給字符串中的字母是大小寫混合存在,第二步,將字符串中的字母化為同一,或全為大寫,或全小寫;第三步,判斷字符是否左右對稱,若發(fā)現(xiàn)一個位置不對稱,則輸出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')                        //大寫變?yōu)樾?
        {
            string[j]=strs[i]+'a'-'A';
            j=j+1;
        }
         if(('a'<=strs[i] && strs[i]<='z') ||
                             ('0'<=strs[i] && strs[i]<='9') )   //小寫字母與數(shù)字不做變換
                                                           
        {
            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語言中是以數(shù)組(字符數(shù)組)的形式存放,數(shù)組元素的類型為char,其長度為1個字節(jié)。因而字符指針指向存放該字符串的數(shù)組地址。字符指針的字面量表示存放該字符串的數(shù)組的首個元素的地址。對于指針變量進行加減操作,相當于獎賞這個整數(shù)和指針數(shù)據(jù)類型對應字節(jié)數(shù)的乘積。
對于字符指針,由于其指向字符串的首地址,其對應的數(shù)據(jù)類型為char,數(shù)據(jù)長度為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')                        //大寫變?yōu)樾?
        {
            string[j]=*strs+'a'-'A';
            j=j+1;
        }
         if(('a'<=*strs && *strs<='z') ||
                             ('0'<=*strs && *strs<='9') )   //小寫字母與數(shù)字不做變換                                     
        {
            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指針》

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容