LeetCode(125):驗證回文串


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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM