1. 程式人生 > >驗證迴文字串 C++演算法 leetcode125

驗證迴文字串 C++演算法 leetcode125

題目:驗證迴文字串

給定一個字串,驗證它是否是迴文串,只考慮字母和數字字元,可以忽略字母的大小寫。

說明:本題中,我們將空字串定義為有效的迴文串。

示例 1:

輸入: "A man, a plan, a canal: Panama"
輸出: true

示例 2:

輸入: "race a car"
輸出: false

解答:

迴文字串,即是正讀和反讀都是同一個字串,如deed、minim和gig。在本題目存在空格和非字母數字等字元形式,難度增加。

  1. 要考慮的是去除空格和非字母數字的影響;
  2. 建立左右兩組指標,left和right;
  3. 分別從字元的開頭和結尾處開始遍歷整個字串,如果遇到非字母數字的字元就跳過,繼續往下找,直到找到下一個字母數字或者結束遍歷,如果遇到大寫字母,就將其轉為小寫;
  4. 等左右指標都找到字母數字時,比較這兩個字元,若相等,則繼續比較下面兩個分別找到的字母數字,若不相等,直接返回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;
	}
}