什么是回文串
回文串是指正着读和反着读都一样的字符串。比如“level”、“racecar”、“mom”等都是回文串。
回文串在计算机科学中有很多应用,比如在字符串匹配算法中,判断给定的字符串是否回文也是常见的问题。
检查字符串是否为回文串
基本思路
判断一个字符串是否回文,最基本的思路就是将该字符串的两端逐一比较。如果两端的字符相同,则继续比较它们的下一个字符,直到失败或者成功为止。
代码实现
下面是一个使用C语言实现判断字符串是否回文的例子。
#include <stdio.h>
int is_palindrome(char* str) {
int len = strlen(str);
for (int i = 0; i < len / 2; i++) {
if (str[i] != str[len - i - 1]) {
return 0;
}
}
return 1;
}
int main() {
char* str1 = "level";
char* str2 = "hello";
printf("%s is %s\n", str1, is_palindrome(str1) ? "a palindrome" : "not a palindrome");
printf("%s is %s\n", str2, is_palindrome(str2) ? "a palindrome" : "not a palindrome");
return 0;
}
使用这段代码,我们可以输入任何一个字符串来判断它是否为回文串。
代码解释
首先是字符串的长度。
int len = strlen(str);
strlen是C语言中的一个内置函数,用来计算字符串的长度。计算出字符串长度之后,我们需要遍历字符串的前半部分,将它与字符串的后半部分逐个比较。
for (int i = 0; i < len / 2; i++) {
if (str[i] != str[len - i - 1]) {
return 0;
}
}
代码中for循环的条件是 i < len / 2,因为当 i 等于 len / 2 时,字符串的中间部分已经遍历完成,不需要再比较了。
然后在循环内部,我们依次比较字符串的左右两端,当它们不相同时,我们可以直接返回0,表示该字符串不是回文串。如果循环正常结束,我们就返回1,表示该字符串是回文串。
优化
上述实现的时间复杂度是 O(n),但是还有一种更优化的做法,它的时间复杂度为 O(n/2)。
int is_palindrome(char* str) {
char* start = str;
char* end = start + strlen(str) - 1;
while (start < end) {
if (*start++ != *end--) {
return 0;
}
}
return 1;
}
使用了指针的方式时,需要定义两个指针变量,分别指向字符串的首尾位置。然后不断将这两个指针向中间移动,逐个比较它们所指向的字符是否相等。如果两个指针所指向的字符不相等,就说明该字符串不是回文串,直接返回0。如果两个指针最后都指向了同一个位置,则说明该字符串是回文串。
总结
判断字符串是否回文,是我们日常开发中经常会遇到的问题。在C语言中,我们可以使用循环遍历字符串逐个比较的方式来实现判断,也可以使用指针的方式,将比较的过程逐步向字符串中心位置推进。在实现代码之前,我们需要注意字符串长度为奇数和偶数的情况,在代码中进行特别处理。