回文判断(C/C++)
2016-05-23 14:25
274 查看
给定一个字符串,如何判断这个字符串是否是回文串?
思路一:直接在字符串的首尾两端各放置一个指针*front和*back,然后开始遍历整个字符串,当*front不再小于*back时完成遍历。在此过程中,如果出现二者的值不相等,那么久表示不是回文串;如果两个指针指向的字符始终相等就表示该字符串是回文字符串。
时间复杂度:O(n)
思路二:先使用快慢指针确定出字符串的中间位置,然后分别使用两个指针从开中间位置开始向相反的方向扫描,知道遍历完整个字符串。
时间复杂度:O(n)
找中间位置的方法:
1、快慢指针;
2、一种有效的计算方法
//m定位到字符串的中间位置
两种思路的代码如下:
综上所述,虽然上面两种方法采用不同的遍历方式来扫描字符串,但是最终的时间复杂度都是一样,效率基本上是一样的。
思路一:直接在字符串的首尾两端各放置一个指针*front和*back,然后开始遍历整个字符串,当*front不再小于*back时完成遍历。在此过程中,如果出现二者的值不相等,那么久表示不是回文串;如果两个指针指向的字符始终相等就表示该字符串是回文字符串。
时间复杂度:O(n)
思路二:先使用快慢指针确定出字符串的中间位置,然后分别使用两个指针从开中间位置开始向相反的方向扫描,知道遍历完整个字符串。
时间复杂度:O(n)
找中间位置的方法:
1、快慢指针;
2、一种有效的计算方法
//m定位到字符串的中间位置
int m = ((n >> 1) - 1) >= 0 ? (n >> 1) - 1 : 0; first = str + m; second= str + n - 1 - m;
两种思路的代码如下:
//思路一 #include <iostream> using namespace std; //*s为字符串,n为字符串的长度 bool IsPalindrome(char *str, int n) { //指向字符串首尾的指针 char *front = str; char *back = str + n - 1; if(str==NULL||n<1) { return false; } while (front<back) { if (*front != *back) { return false; } front++; back--; } return true; } int main( ) { char str[] = "abba"; int n = strlen(str); bool sign; sign = IsPalindrome(str, n); if (sign == true) { cout << "此字符串是回文字符串"<<endl; } else { cout << "此字符串不是回文字符串" << endl; } return 0; } //思路二 #include <iostream> using namespace std; //*s为字符串,n为字符串的长度 bool IsPalindrome(char *str, int n) { //指向字符串首尾的指针 char *first; char *second; if (str == NULL || n<1) { return false; } //m定位到字符串的中间位置 int m = ((n >> 1) - 1) >= 0 ? (n >> 1) - 1 : 0; first = str + m; second= str + n - 1 - m; while (first>str) { if (*first!= *second) { return false; } first--; second++; } return true; } int main( ) { char str[] = "abcgba"; int n = strlen(str); bool sign; sign = IsPalindrome(str, n); if (sign == true) { cout << "此字符串是回文字符串"<<endl; } else { cout << "此字符串不是回文字符串" << endl; } return 0; }
综上所述,虽然上面两种方法采用不同的遍历方式来扫描字符串,但是最终的时间复杂度都是一样,效率基本上是一样的。
相关文章推荐
- 【C语言】冒泡排序与回文判断
- 《编程之法》1.5回文判断
- c++实现字符串回文判断
- (动态规划)最长回文子序列、回文子序列个数
- 1136. A Delayed Palindrome (20)
- Python入门实战2——判断回文(超详解注释)
- 关于gsoap工具soapcpp2.exe无法通过头文件生成wsdl接口描述语言文件的原因
- c++怎样调用类的静态方法
- 《21天学通C++》_2 2016.5.23
- POJ 1269 Intersecting Lines(计算几何)
- 设计模式C++实现(6)——建造者模式
- 设计模式C++实现(5)——原型模式、模板方法模式
- 设计模式C++实现(4)——单例模式
- C/C++中的拷贝构造函数和赋值构造函数
- 常用的C语言定义
- 设计模式C++实现(3)——适配器模式
- 设计模式C++实现(2)——策略模式
- C/C++中的浮点数运算
- C语言文件操作详解
- 设计模式C++实现(1)——工厂模式