Easy!
題目描述:
給定一個字符串,驗證它是否是回文串,只考慮字母和數字字符,可以忽略字母的大小寫。
說明:本題中,我們將空字符串定義為有效的回文串。
示例 1:
輸入: "A man, a plan, a canal: Panama" 輸出: true
示例 2:
輸入: "race a car" 輸出: false
解題思路:
驗證回文字符串是比較常見的問題,所謂回文,就是一個正讀和反讀都一樣的字符串,比如“level”或者“noon”等等就是回文串。但是這里,加入了空格和非字母數字的字符,增加了些難度,但其實原理還是很簡單:只需要建立兩個指針,left和right, 分別從字符的開頭和結尾處開始遍歷整個字符串,如果遇到非字母數字的字符就跳過,繼續往下找,直到找到下一個字母數字或者結束遍歷,如果遇到大寫字母,就將其轉為小寫。等左右指針都找到字母數字時,比較這兩個字符,若相等,則繼續比較下面兩個分別找到的字母數字,若不相等,直接返回false,時間復雜度為O(n)。
C++解法一:
1 class Solution { 2 public: 3 bool isPalindrome(string s) { 4 int left = 0, right = s.size() - 1 ; 5 while (left < right) { 6 if (!isAlphaNum(s[left])) ++left; 7 else if (!isAlphaNum(s[right])) --right; 8 else if ((s[left] + 32 - 'a') %32 != (s[right] + 32 - 'a') % 32) return false; 9 else { 10 ++left; --right; 11 } 12 } 13 return true; 14 } 15 bool isAlphaNum(char &ch) { 16 if (ch >= 'a' && ch <= 'z') return true; 17 if (ch >= 'A' && ch <= 'Z') return true; 18 if (ch >= '0' && ch <= '9') return true; 19 return false; 20 } 21 };
我們也可以用系統自帶的判斷是否是數母字符的判斷函數isalnum。
C++解法二:
1 class Solution { 2 public: 3 bool isPalindrome(string s) { 4 int left = 0, right = s.size() - 1 ; 5 while (left < right) { 6 if (!isalnum(s[left])) ++left; 7 else if (!isalnum(s[right])) --right; 8 else if ((s[left] + 32 - 'a') %32 != (s[right] + 32 - 'a') % 32) return false; 9 else { 10 ++left; --right; 11 } 12 } 13 return true; 14 } 15 };
對於該問題的擴展,還有利用Manacher算法來求解最長回文字符串問題,參見http://www.cnblogs.com/grandyang/p/4475985.html。