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指標》
相關文章
- Leetcode Valid PalindromeLeetCode
- LeetCode-Valid PalindromeLeetCode
- Valid Palindrome leetcode javaLeetCodeJava
- leetcode刷題--Valid PalindromeLeetCode
- LeetCode: Valid Palindrome [125]LeetCode
- LeetCode 第 125 題 (Valid Palindrome)LeetCode
- [LeetCode] Valid Palindrome II 驗證迴文字串之二LeetCode字串
- Palindrome PairsAI
- LeetCode-最小棧LeetCode
- LeetCode-連結串列LeetCode
- LeetCode-兩數之和LeetCode
- LeetCode-兩數相加LeetCode
- leetcode Palindrome NumberLeetCode
- D - Avoid K Palindrome
- LeetCode-單詞規律LeetCode
- LeetCode- Implement Trie (Prefix Tree)LeetCode
- LeetCode- Longest Absolute File PathLeetCode
- Leetcode- Single Number IILeetCode
- 搞定字串類面試題-Palindrome字串面試題
- Leetcode 9 Palindrome NumberLeetCode
- LeetCode-Palindrome PairsLeetCodeAI
- Palindrome Number leetcode javaLeetCodeJava
- spring - mvc - @ValidSpringMVC
- 【LeetCode-棧】有效的括號LeetCode
- LeetCode- Count Numbers with Unique DigitsLeetCodeGit
- [LeetCode] 9. Palindrome NumberLeetCode
- LeetCode-Palindrome Permutation IILeetCode
- 【LeetCode】Palindrome Pairs(336)LeetCodeAI
- Leetcode: Palindrome Partitioning IILeetCode
- [LintCode] Palindrome Linked List
- LeetCode - 9. Palindrome NumberLeetCode
- Leetcode Palindrome Linked ListLeetCode
- Palindrome Partitioning leetcode javaLeetCodeJava
- leetcode-動態規劃總結LeetCode動態規劃
- leetcode-面試經典150題LeetCode面試
- CSS :valid 選擇器CSS
- 941. Valid Mountain ArrayAI
- fatal: Not a valid object name: 'master'ObjectAST