给定一个字符串,如何判断这个字符串是否是回文串? 请用c语言或c++实现两种算法,并给出算法的时间复杂度分析。
时间: 2023-06-12 18:02:35 浏览: 100
判断回文串的两种算法如下:
算法1:双指针法
思路:使用两个指针从字符串的左右两端同时向中间扫描,如果左右两端的字符不相同,返回false,否则继续扫描,直到两个指针相遇,返回true。
时间复杂度:O(n),其中n为字符串的长度。
代码如下:
```c
#include <stdio.h>
#include <string.h>
int isPalindrome(char* s) {
int len = strlen(s);
int left = 0, right = len - 1;
while (left < right) {
if (s[left] != s[right]) {
return 0; // 不是回文串
}
left++;
right--;
}
return 1; // 是回文串
}
int main() {
char s[] = "abcdcba";
if (isPalindrome(s)) {
printf("%s is a palindrome\n", s);
} else {
printf("%s is not a palindrome\n", s);
}
return 0;
}
```
算法2:递归法
思路:判断字符串的第一个字符和最后一个字符是否相同,如果相同,则递归判断剩余子串是否为回文串,否则返回false。
时间复杂度:O(n),其中n为字符串的长度。但是由于存在递归调用,所以空间复杂度可能比较高。
代码如下:
```c
#include <stdio.h>
#include <string.h>
int isPalindrome(char* s, int left, int right) {
if (left >= right) {
return 1; // 是回文串
}
if (s[left] != s[right]) {
return 0; // 不是回文串
}
return isPalindrome(s, left + 1, right - 1);
}
int main() {
char s[] = "abcdcba";
if (isPalindrome(s, 0, strlen(s) - 1)) {
printf("%s is a palindrome\n", s);
} else {
printf("%s is not a palindrome\n", s);
}
return 0;
}
```
阅读全文