1. 程式人生 > 實用技巧 >125. 驗證迴文串--雙指標

125. 驗證迴文串--雙指標

125. 驗證迴文串

難度簡單

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

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

示例 1:

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

示例 2:

輸入: "race a car"
輸出: false
通過次數155,808 提交次數336,967

方法一:篩選 + 判斷
最簡單的方法是對字串 ss 進行一次遍歷,並將其中的字母和數字字元進行保留,放在另一個字串 \textit{sgood}sgood 中。這樣我們只需要判斷 \textit{sgood}sgood 是否是一個普通的迴文串即可。

判斷的方法有兩種。第一種是使用語言中的字串翻轉 API 得到 \textit{sgood}sgood 的逆序字串 \textit{sgood\_rev}sgood_rev,只要這兩個字串相同,那麼 \textit{sgood}sgood 就是迴文串。

C++Python3Java

class Solution {
public:
bool isPalindrome(string s) {
string sgood;
for (char ch: s) {
if (isalnum(ch)) {
sgood += tolower(ch);

}
}
string sgood_rev(sgood.rbegin(), sgood.rend());
return sgood == sgood_rev;
}
};
第二種是使用雙指標。初始時,左右指標分別指向 \textit{sgood}sgood 的兩側,隨後我們不斷地將這兩個指標相向移動,每次移動一步,並判斷這兩個指標指向的字元是否相同。當這兩個指標相遇時,就說明 \textit{sgood}sgood 時迴文串。

C++Python3GolangJava

class Solution {
public:
bool isPalindrome(string s) {

string sgood;
for (char ch: s) {
if (isalnum(ch)) {
sgood += tolower(ch);
}
}
int n = sgood.size();
int left = 0, right = n - 1;
while (left < right) {
if (sgood[left] != sgood[right]) {
return false;
}
++left;
--right;
}
return true;
}
};
複雜度分析

時間複雜度:O(|s|)O(∣s∣),其中 |s|∣s∣ 是字串 ss 的長度。

空間複雜度:O(|s|)O(∣s∣)。由於我們需要將所有的字母和數字字元存放在另一個字串中,在最壞情況下,新的字串 \textit{sgood}sgood 與原字串 ss 完全相同,因此需要使用 O(|s|)O(∣s∣) 的空間。

方法二:在原字串上直接判斷
我們可以對方法一中第二種判斷迴文串的方法進行優化,就可以得到只使用 O(1)O(1) 空間的演算法。

我們直接在原字串 ss 上使用雙指標。在移動任意一個指標時,需要不斷地向另一指標的方向移動,直到遇到一個字母或數字字元,或者兩指標重合為止。也就是說,我們每次將指標移到下一個字母字元或數字字元,再判斷這兩個指標指向的字元是否相同。

C++Python3GolangJava

class Solution {
public:
bool isPalindrome(string s) {
int n = s.size();
int left = 0, right = n - 1;
while (left < right) {
while (left < right && !isalnum(s[left])) {
++left;
}
while (left < right && !isalnum(s[right])) {
--right;
}
if (left < right) {
if (tolower(s[left]) != tolower(s[right])) {
return false;
}
++left;
--right;
}
}
return true;
}
};
複雜度分析

時間複雜度:O(|s|)O(∣s∣),其中 |s|∣s∣ 是字串 ss 的長度。

空間複雜度:O(1)O(1)。

作者:LeetCode-Solution
連結:https://leetcode-cn.com/problems/valid-palindrome/solution/yan-zheng-hui-wen-chuan-by-leetcode-solution/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。