判断回文串
使用相向双指针判断字符串是否为回文串,O(n) 时间、O(1) 空间。
判断回文串(hdu 2029)
问题定义: 判断一个字符串是否是回文串(正读和反读都一样)。
算法步骤:
- 初始化左指针
left = 0,右指针right = s.length() - 1。 - 当
left < right时,进行循环: a. 比较s[left]和s[right]。 b. 如果s[left] != s[right],则该字符串不是回文串,返回false。 c. 如果相等,则继续向中间收缩指针:left++,right--。 - 如果循环正常结束,说明所有对称位置的字符都相等,返回
true。
复杂度分析:
- 时间复杂度:
。 - 空间复杂度:
。
证明
直觉的创建一个命题:
- 若
: 表示字符串 是回文串 - 则
: - 一个命题和它的逆否命题等价:
代码实现
cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <string>
#include <iostream>
bool is_palindrome(const string& s) {
int left = 0;
int right = s.length() - 1;
while (left < right) {
if (s[left] != s[right]) {
return false;
}
left++;
right--;
}
return true;
}