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.

題目分析

本題中要求對(duì)于一給定字符串寒锚,判斷其是否屬于回文(palindrome),所謂回文是指順讀和倒讀都一樣的詞語(yǔ)雳锋。題目中要求判斷的內(nèi)容僅包含數(shù)字和字母兩種字符,標(biāo)點(diǎn)符號(hào)不屬于判斷內(nèi)容蜘拉。如

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

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

字符串strs1中除標(biāo)點(diǎn)符號(hào)外的字符順讀與倒讀均相同(忽略字幕大小寫)芒划,er字符串strs2中順讀與倒讀不一致,故輸出false贼穆。

解題思路
所謂回文是指順讀和倒讀均相同的字符串哼御,因此屬于回文的字符串必定左右對(duì)稱坯临。我們只需要判定所給的字符串是否左右對(duì)稱即可解決問(wèn)題。
由于恋昼,所給字符串中可能包含標(biāo)點(diǎn)符號(hào)看靠,而標(biāo)點(diǎn)符號(hào)不在判斷之列,因此第一步需要將字符串中的標(biāo)點(diǎn)符號(hào)去掉液肌,只留下字母和數(shù)字衷笋;由于所給字符串中的字母是大小寫混合存在,第二步矩屁,將字符串中的字母化為同一,或全為大寫爵赵,或全小寫吝秕;第三步,判斷字符是否左右對(duì)稱空幻,若發(fā)現(xiàn)一個(gè)位置不對(duì)稱烁峭,則輸出false,若全部對(duì)稱,輸出true约郁。
特殊情況:
(1)空字符串(“”)。對(duì)于空字符串鬓梅,認(rèn)為其屬于回文,輸出true绽快。
(2)字符串中僅含有一個(gè)字符。單個(gè)字符與其本身對(duì)稱坊罢,也屬于回文续担,因此輸出true。
C語(yǔ)言代碼

#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)                                      //長(zhǎng)度為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’,提高運(yùn)行速度 
    for(i=0;i<j/2;i++)                                         //判斷是否左右對(duì)稱物遇,最多只需判斷其長(zhǎng)度的一般 
    {
        if(string[i]!=string[j-i-1])                           //找到一個(gè)不一致,說(shuō)明不對(duì)稱询兴,結(jié)束 
            break;
    }
    if(i==j/2)                                                 //所有對(duì)應(yīng)位都相同,即說(shuō)明左右對(duì)稱 
        flag=true;
    return flag;
}

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

對(duì)于字符串航夺,C語(yǔ)言中是以數(shù)組(字符數(shù)組)的形式存放蕉朵,數(shù)組元素的類型為char,其長(zhǎng)度為1個(gè)字節(jié)阳掐。因而字符指針指向存放該字符串的數(shù)組地址。字符指針的字面量表示存放該字符串的數(shù)組的首個(gè)元素的地址缭保。對(duì)于指針變量進(jìn)行加減操作,相當(dāng)于獎(jiǎng)賞這個(gè)整數(shù)和指針數(shù)據(jù)類型對(duì)應(yīng)字節(jié)數(shù)的乘積艺骂。
對(duì)于字符指針,由于其指向字符串的首地址钳恕,其對(duì)應(yīng)的數(shù)據(jù)類型為char,數(shù)據(jù)長(zhǎng)度為1厘肮,因此指針字符加一,相當(dāng)于地址加一睦番,因此可以通過(guò)指針加一來(lái)訪問(wèn)字符串的單個(gè)字符耍属。本題也可以通過(guò)指針加一的方式來(lái)訪問(wèn)字符串的各個(gè)字符巩检。

bool isPalindrome(char* strs) {
    int len=strlen(strs);
    bool flag=false;
    int i=0,j=0;
    if (len==0 || len==1)                                         //長(zhǎng)度為1或0 
        return true;

    char string[len];
    
    while(*strs!='\0')                                             //strs代表首地址,*解引用就表示單個(gè)字符
    {
        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’,提高運(yùn)行速度 
    for(i=0;i<j/2;i++)                                         //判斷是否左右對(duì)稱领舰,最多只需判斷其長(zhǎng)度的一般 
    {
        if(string[i]!=string[j-i-1])                           //找到一個(gè)不一致厦瓢,說(shuō)明不對(duì)稱提揍,結(jié)束 
            break;
    }
    if(i==j/2)                                                 //所有對(duì)應(yīng)位都相同煮仇,即說(shuō)明左右對(duì)稱 
        flag=true;
    return flag;
}

參考文獻(xiàn)
[1] https://leetcode.com/submissions/detail/110747419/
[2] 《深入理解C指針》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市刨仑,隨后出現(xiàn)的幾起案子夹姥,更是在濱河造成了極大的恐慌杉武,老刑警劉巖辙售,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件轻抱,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡旦部,警方通過(guò)查閱死者的電腦和手機(jī)祈搜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門士八,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人婚度,你說(shuō)我怎么就攤上這事』茸拢” “怎么了?”我有些...
    開封第一講書人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵灰粮,是天一觀的道長(zhǎng)忍坷。 經(jīng)常有香客問(wèn)我,道長(zhǎng)佩研,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任旬薯,我火速辦了婚禮,結(jié)果婚禮上硕舆,老公的妹妹穿的比我還像新娘。我一直安慰自己抚官,他們只是感情好阶捆,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著洒试,像睡著了一般。 火紅的嫁衣襯著肌膚如雪卒煞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,475評(píng)論 1 312
  • 那天畔裕,我揣著相機(jī)與錄音碉碉,去河邊找鬼。 笑死垢粮,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蜡吧。 我是一名探鬼主播,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼元潘,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼君仆!你這毒婦竟也來(lái)了翩概?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤牍鞠,失蹤者是張志新(化名)和其女友劉穎评姨,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吐句,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年攀芯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了净宵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡择葡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出敏储,到底是詐尸還是另有隱情,我是刑警寧澤妥箕,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布更舞,位于F島的核電站畦幢,受9級(jí)特大地震影響缆蝉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜刊头,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望印颤。 院中可真熱鬧,春花似錦年局、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至焚志,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間酱酬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工膳沽, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人挑社。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓痛阻,卻偏偏與公主長(zhǎng)得像菌瘪,于是被迫代替她去往敵國(guó)和親阱当。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容