回文判断
来源:互联网 发布:gallery3d源码分析 编辑:程序博客网 时间:2024/06/06 00:54
- 问题描述
- 回文判断1-两头到中间
- 算法思想
- 两头到中间代码实现
- 回文判断2-中间到两头
- 算法思想
- 中间到两头代码实现
- 回文判断3-翻转reverse
- 算法思想
- reverse代码实现
- 回文判断4-栈stack
- 算法思想
- 算法实现
问题描述
给定一个字符串,判断这个字符串是否是回文
回文的特点在于对称性,针对这个性质,笔者想到的方法有:
1)两头到中间
2)中间到两头
3)recerse前后判断
4)栈
下面,笔者将分别这四种方法用代码的形式实现
回文判断1-两头到中间
算法思想
头、尾指针分别指向字符串的首元素和尾元素,逐一比较,若有不同,则返回false,程序退出。直到头尾指针指向同一个中间元素,算法终止。时间复杂度为O(n)
两头到中间代码实现
/************************Author:tmwdate:2017-11-13************************/#include <stdio.h>#include <stdlib.h>#include <stdbool.h>#include <string.h>bool isPalindrome_edge2middle(char* array){ //字符串合法性检查 if(strlen(array) == 0 || array==NULL) return false; int front = 0; int rear = strlen(array)-1; while( front < rear ) { if(array[front] != array[rear]) { return false; break; } front++; rear--; } return true;}
回文判断2-中间到两头
算法思想
- 首先对字符串进行输入合法性检查
- 在输入合法的前提下,对字符串进行操作
1)当为偶数串时,起始比较的中间数为(首+尾)/2和(首+尾)/2+1;
2)当为奇数串时,起始比较的中间数为(首+尾)/2-1和(首+尾)/2+1
算法复杂度为O(n)
中间到两头代码实现
/***********************Author:tmwdate:2017-11-13************************/#include <stdio.h>#include <stdlib.h>#include <string.h>#include <stdbool.h>bool isPalindrome_middle2edge(char* array){ //字符串合法性检查 if(array==NULL || strlen(array)==0) return false; //分类判断 if(strlen(array)%2!=0)//说明为奇数串 { int front = (strlen(array)-1)/2-1;//下标从0开始 int rear = (strlen(array)-1)/2+1; while(front>=0) { if(array[front]!=array[rear]) return false; front--; rear++; } } else { int front = (strlen(array)-1)/2;//下标从0开始 int rear = (strlen(array)-1)/2+1; while(front>=0) { if(array[front]!=array[rear]) return false; front--; rear++; } } return true;}
回文判断3-翻转(reverse)
算法思想
通过调用reverse函数,将原字符串翻转后与翻转前的字符串进行比较,如果相同,则是回文,反之不是。时间复杂度为O(n)
reverse代码实现
/***********************Author:tmwdate:2017-11-13************************/#include <stdio.h>#include <stdlib.h>#include <string.h>#include <stdbool.h>#define swap(x,y,t) (t=x,x=y,y=t)bool isPalindrome_reverse(char* array){ //输入合法性检查 if(strlen(array)==0 || array==NULL) return false; char* temp; temp = (char*)malloc((strlen(array)+1)*sizeof(char)); strcpy(temp,array);//char* strcpy(char* des,const char* source) int front = 0; int rear = strlen(array)-1; while( front < rear ) { char temp1; swap(array[front],array[rear],temp1); front++; rear--; } if(strcmp(array,temp)==0) return true; else return false;}
回文判断4-栈(stack)
算法思想
将元素一一进栈,然后出栈,比较进栈前后是否一致,一致则为回文,不一致则不是回文。算法时间复杂度为O(n)。
算法实现
/***********************Author:tmwdate:2017-11-13************************/#include <stdio.h>#include <stdlib.h>#include <stdbool.h>#include <string.h>bool isPalindrome_stack(char* array){ //输入合法性判定 if(strlen(array)==0 || array==NULL) return false; char* stack; stack = (char*)malloc((strlen(array)+1)*sizeof(char)); int top = 0; for(top=0;top<strlen(array);top++)//入栈 stack[top] = array[top]; top--;//top始终指向栈顶 char* after; after = (char*)malloc((strlen(array))*sizeof(char));//保存出栈后的字符串 int i = 0; while(top>=0) after[i++] = stack[top--];//出栈 after[i] = '\0';//注意!!字符串以\0结尾!否则会有乱码 free(stack);//释放栈空间 if(strcmp(array,after)==0) return true;//栈前栈后一样,是回文,返回1 else return false;}
梦想还是要有的,万一实现了呢~~~ヾ(◍°∇°◍)ノ゙
阅读全文
0 0
- 判断回文
- 回文判断
- 判断回文
- 判断回文
- 回文判断
- 回文判断
- 判断回文!
- 判断回文
- 回文判断
- 判断回文
- 回文判断
- 回文判断
- 判断回文
- 回文判断
- 回文判断
- 判断回文
- 回文判断
- 判断回文
- Web AppBuilder学习笔记1
- nginx 常用命令
- Android学习之搞搞7.0和6.0uri的不同
- 欢迎使用CSDN-markdown编辑器
- 四元数与复数之间的关系
- 回文判断
- Matlab实现 理想低通、巴特沃斯低通、高斯低通、理想高通、巴特沃斯高通、高斯高通(d=10,50,150)
- 深度递归学习
- Linux 命令
- 1.笔记 5.7.10MySQL——安装
- leetcode题解-38. Count and Say
- 4. 卷2(进程间通信)---管道和FIFO
- 隐马尔科夫模型(二)
- centos安装golang、protobuf