回文串之判断

 1 //从左右两边开始比较判断
 2 #include<iostream>
 3 #include<string.h>
 4 using namespace std;
 5 const int MAXN = 1e5;
 6 bool is_palindrome(char *s, int len)
 7 {
 8     if(s == NULL || len < 1)    //非法输入
 9         return false;
10     char *front, *tail;    //首尾指针
11     //指针声明了就要记得初始化
12     front = s;
13     tail = s + len - 1;
14     while(front < tail)
15     {
16         if(*front != *tail)
17             return false;
18         front++;
19         tail--;
20     }
21     return true;
22 }
23 int main()
24 {
25     char str[MAXN];
26     while(cin >> str)
27     {
28         int len = strlen(str);
29         cout << is_palindrome(str, len) << endl;
30     }
31     return 0;
32 }
33 //时间复杂度O(n),空间复杂度O(1)

 

 1 //从中间开始往两边判断
 2 #include<iostream>
 3 #include<string.h>
 4 using namespace std;
 5 const int MAXN = 1e5;
 6 bool is_palindrome(char *s, int len)
 7 {
 8     if(s == NULL || len < 1)
 9         return false;
10     char *left, *right;
11     int mid = ((len >> 1) - 1) >= 0 ? (len >> 1) - 1 : 0;
12     left = s + mid;
13     right = s + len - 1 - mid;
14     while(left >= s)
15     {
16         if(*left != *right)
17             return false;
18         left--;
19         right++;
20     }
21     return true;
22 }
23 int main()
24 {
25     char str[MAXN];
26     while(cin >> str)
27     {
28         int len = strlen(str);
29         cout << is_palindrome(str, len) << endl;
30     }
31     return 0;
32 }
33 //时间复杂度O(n),空间复杂度O(1)

上面两种判断回文的方法在复杂度上没有区别,都是O(n)的时间复杂度和O(1)的空间复杂度。但是第二种从中间往两边判断的方法在解决一些问题时有独到之处。

转载于:https://www.cnblogs.com/friend-A/p/9911632.html

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值