驗證迴文字串 C++演算法 leetcode125
題目:驗證迴文字串
給定一個字串,驗證它是否是迴文串,只考慮字母和數字字元,可以忽略字母的大小寫。
說明:本題中,我們將空字串定義為有效的迴文串。
示例 1:
輸入: "A man, a plan, a canal: Panama" 輸出: true
示例 2:
輸入: "race a car" 輸出: false
解答:
迴文字串,即是正讀和反讀都是同一個字串,如deed、minim和gig。在本題目存在空格和非字母數字等字元形式,難度增加。
- 要考慮的是去除空格和非字母數字的影響;
- 建立左右兩組指標,left和right;
- 分別從字元的開頭和結尾處開始遍歷整個字串,如果遇到非字母數字的字元就跳過,繼續往下找,直到找到下一個字母數字或者結束遍歷,如果遇到大寫字母,就將其轉為小寫;
- 等左右指標都找到字母數字時,比較這兩個字元,若相等,則繼續比較下面兩個分別找到的字母數字,若不相等,直接返回false。
時間複雜度為O(n)。
程式碼示例:
1.將上述所需功能進行類的封裝
class Solution { public: bool isPalindrome(string s) { int left = 0, right = s.size() - 1; while (left < right) { if (!isAlphaNum(s[left])) ++left; else if (!isAlphaNum(s[right])) --right; else if ((s[left] + 32 - 'a') % 32 != (s[right] + 32 - 'a') % 32) return false; else { ++left; --right; } } return true; } bool isAlphaNum(char &ch) { if (ch >= 'a' && ch <= 'z') return true; if (ch >= 'A' && ch <= 'Z') return true; if (ch >= '0' && ch <= '9') return true; return false; } };
分析:這個類裡面有兩個函式:
1.isPalindrome(string s)
首先定義左右指標,left賦值為0,right賦值字串最大值s.size()-1;
當left<rihgt時,一直進入while迴圈,通過isAlphaNum(char &ch)函式來檢驗是否是非字母字元,若是,則自加一/自減一,跳過;
若字串中出現大寫字母,通過下面指令轉換為小寫字母
else if ((s[left] + 32 - 'a') %32 != (s[right] + 32 - 'a') % 32)
PS:
//如何是‘A’或者‘a’的話,它們減去‘a’得到的數分別是:-32和0,再加上32的話正好是0和32,除以32——餘數都為0
//如何是‘B’或者‘b’的話,它們減去‘a’得到的數分別是:-31和1,再加上32的話正好是1和33,除以32——餘數都為1
再通過括號裡的判斷,進行判定大小寫字母是否為同一個字母,若是往下繼續執行,若不是,跳出迴圈,返回false。
2.isAlphaNum(char &ch)
這個函式用來判斷,字串中該字元是數字還是字母。
2.標頭檔案
#include<iostream>
#include<string>
using namespace std;
3.主函式
int main()
{
string s = "A man, a plan, a canal: Panama";
class Solution pt;
int R=pt.isPalindrome(s);
if (R)
{
cout << "true" << endl;
}
else
{
cout << "flase" << endl;
}
}
先定義字串string s="A man, a plan, a canal: Panama" 呼叫類class solution。判斷R值,輸出true/false。
寫的程式碼都在VS2015下測試沒有問題,如果輸入為string s="A man, a plan, a canal: Panama"
該題所有測試程式碼如下
#include<iostream>
#include<string>
using namespace std;
class Solution {
public:
bool isPalindrome(string s)
{
int left = 0, right = s.size() - 1;
while (left < right)
{
if (!isAlphaNum(s[left]))
++left;
else if (!isAlphaNum(s[right]))
--right;
else if ((s[left] + 32 - 'a') % 32 != (s[right] + 32 - 'a') % 32)
return false;
else {
++left;
--right;
}
}
return true;
}
bool isAlphaNum(char &ch)
{
if (ch >= 'a' && ch <= 'z')
return true;
if (ch >= 'A' && ch <= 'Z')
return true;
if (ch >= '0' && ch <= '9')
return true;
return false;
}
};
int main()
{
string s = "A man, a plan, a canal: Panama";
class Solution pt;
int R=pt.isPalindrome(s);
if (R)
{
cout << "true" << endl;
}
else
{
cout << "flase" << endl;
}
}