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