检查给定字符串是否是回文的C程序?

什么是回文串

回文串是指正着读和反着读都一样的字符串。比如“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语言中,我们可以使用循环遍历字符串逐个比较的方式来实现判断,也可以使用指针的方式,将比较的过程逐步向字符串中心位置推进。在实现代码之前,我们需要注意字符串长度为奇数和偶数的情况,在代码中进行特别处理。

免责声明:本文来自互联网,本站所有信息(包括但不限于文字、视频、音频、数据及图表),不保证该信息的准确性、真实性、完整性、有效性、及时性、原创性等,版权归属于原作者,如无意侵犯媒体或个人知识产权,请来电或致函告之,本站将在第一时间处理。猿码集站发布此文目的在于促进信息交流,此文观点与本站立场无关,不承担任何责任。

后端开发标签