问题
回文,英文palindrome,指一个顺着读和反过来读都一样的字符串,比如madam、我爱我,这样的短句在智力性、趣味性和艺术性上都颇有特色,中国历史上还有很多有趣的回文诗。那么如何判断一个字串是否是回文?
思路1
既然回文字符串有正过来和反过来读都一样的特性,那么我们可以考虑将字符串翻转,然后再与原字符串相比较,这种思路是最显而易见的。这种思路的时间复杂度和空间复杂度都为O(n):
void Reverse(char *str, int from, int to){
if(NULL == str)
return ;
while(from < to){
char temp = str[from];
str[from++] = str[to];
str[to--] = temp;
}
}
bool IsPalindrome(char *str){
char *p = new char[strlen(str)];
strcpy(p, str);
Reverse(str, 0, strlen(str)-1);
int begin = 0;
while(begin < strlen(str)){
if(p[begin] != str[begin])
return false;
++begin;
}
return true;
}
思路2
虽然思路1很好的解决了这个问题,但是我们有没有更好的方法呢?当然有,可以之间比较第一个字符和最后一个字符,第二个字符与倒数第二个字符……,这种方法的空间复杂度可以减小到O(1).
bool IsPalindrome(char *str){
if(NULL == str)
return false;
int begin = 0;
int end = strlen(str)-1;
while(begin < end){
if(str[begin++] != str[end--]){
return false;
}
}
return true;
}
思路3
思路3其实就是思路2的逆过程,从中间往两边比,时间复杂度和空间复杂度跟2是一样的。
bool IsPalindrome(char* str, int n){
if(NULL == str || n < 1)
return false;
char *first, *second;
int m = n/2 - 1;
first = str + m;
second = str + n - m - 1;
while(first >= str){
if(*(first--) != *(second++))
return false;
}
return true;
}