bool is_palindrome(const string& s) {
return equal(s.begin(), s.end(), s.rbegin());
}
更高效(只比較前半段):
return equal(s.begin(), s.begin() + s.length()/2, s.rbegin());
bool is_palindrome(const char* s) {
int len = strlen(s);
for (int i = 0; i < len/2; ++i)
if (s[i] != s[len-i-1]) return false;
return true;
}
bool is_palindrome(const char* src) {
assert(src != NULL);
const char* end = src;
while (*end) ++end; // 移至結尾 '\0'
--end; // 指向最後一個有效字符
while (src < end) {
if (*src++ != *end--) return false;
}
return true;
}
bool is_palindrome_rec(const char* s, int len) {
if (len <= 1) return true;
if (s[0] != s[len-1]) return false;
return is_palindrome_rec(s+1, len-2);
}
| 版本 | 時間複雜度 | 空間複雜度 | 備註 |
|---|---|---|---|
| STL equal | O(n) | O(1) | 現代 C++ 首選,可讀性最高 |
| 索引雙向 | O(n) | O(1) | 需預計長度,適合隨機存取字串 |
| 雙指針 | O(n) | O(1) | 單遍歷,適合 C 風格字串、流式處理 |
| 遞歸 | O(n) | O(n) | 調用棧開銷大,僅供教學 |
上述方法假設單位元素為 char。處理 UTF-8 需解碼為 code point 序列後再比較,建議使用 ICU 庫或 C++20 std::u8string 配合 std::ranges。