【題解】驗證迴文串

題目要求
給定一個字符串,驗證它是否是迴文串,只考慮字母和數字字符,可以忽略字母的大小寫。
說明:本題中,我們將空字符串定義爲有效的迴文串。

示例 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~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章