非前缀编码(2011年12月23日23:16:27)
来源:互联网 发布:软件银行集团股票 编辑:程序博客网 时间:2024/06/05 21:13
//问题描述
/*Description有很多方法可以实现使用2进制序列对字符进行编码,比如典型的Huffman编码,如果在对字符的2进制编码中不存在某一个字符的编码是另一个字符编码的前缀,那么就称这种编码方式为非前缀编码,Huffman编码就是一种非前缀编码。比如 A:00 B:10 C:0100 D:0101 则这种编码为非前缀编码;A:01 B:10 C:010 D:0000,则这种编码为前缀编码。请写一个程序,判断编码是前缀编码还是非前缀编码。输入:第一行是一个整数K,表示有多少个测试用例,以后每行一个测试用例。每个测试用例为若干个字符串,字符串之间有空格隔开(最大长度不超过1000)。输出:每行输出一个测试用例的结果。如果是非前缀编码输出Yes,否则输出No。Sample Input201 10 0010 000001 10 010 0000Sample OutputYesNo*/
//头文件以及函数申明
#include<stdio.h>#include<string.h>#define MAX 1000int input(char [][MAX]); //处理输入的字符串,将其转换为二维数组,返回二维数组的行数bool compareTwoPrefixString(char *,char *);bool judge(char[][MAX],int);
//主函数
int main(void){ int cases,row,j,k;//cases表示多少个测试用例,row表示行数,从0开始,row行之际上有row+1行 char array[MAX][MAX]; scanf("%d",&cases); getchar(); while(cases--) { row = input(array); //printf("%d\n",row); if(judge(array,row)) { printf("Yes\n"); } else { printf("No\n"); } } return 0;}
//输入处理
//输入处理int input(char array[][MAX]){ int i = 0,j = 0; char ch; while((ch = getchar()) != '\n') { if(ch != ' ') { array[i][j++] = ch; } else if(j != 0) { array[i++][j] = '\0'; //字符串以'\0'结束 j = 0; //j回到0,转到二维数组的第二行 继续赋值 } else { continue; } } if(j != 0) { array[i][j] = '\0';//给最后一个字符串结尾追加'\0' return i; } else { //这是输入' '后继续输入'\n'的情况,input is evil! return i - 1; } //while(getchar() != '\n'); //清空缓冲区的多余字符}
//比较两个字符串,判断其中一个是不是另外一个的前缀
//比较两个字符串,判断其中一个是不是另外一个的前缀bool compareTwoPrefixString(char *str1,char *str2){ /* int length1 = str1.strlen(); int length2 = str2.strlen(); //取两者的较小者 int length = (length1 > length2)?length2:length1; //不是字符串,不能这样做 */ int i = 0; while(str1[i] != '\0' && str2[i] != '\0') { if(str1[i] == str2[i]) { i++; continue; } else { return false; } } return true; //表示违反的前缀编码,即一个字符串是另一个字符串的前缀}
//判断是不是非前缀编码
//判断是不是非前缀编码bool judge(char array[][MAX],int row){ int i,j; //行行之间两两比较 for(i=0; i<row; i++) { for(j=i+1; j<=row; j++) //为什么要有== 因为在那边返回的时候就是从下标0开始算的行数 { if(compareTwoPrefixString(array[i],array[j])) { return false; //有一个字符串是另外一个字符串的前缀了 所以不满足非前缀编码条件 } } } return true; //是非前缀编码}
//提交结果:AC
//没有用什么库函数,主要是不熟悉,所以实现起来稍微复杂点。
- 非前缀编码(2011年12月23日23:16:27)
- 2011年1月23日
- 2011年5月23日
- 2011年06月23日晚上
- 2009年12月23日
- 2008年12月23日
- 2008年12月23日
- 2014年12月23日
- 2014年12月23日 平常心
- 2014年12月23日
- Daliy English--2011年12月23日
- 2011年12月23日 星期五(oracle读书笔记)
- 2011年12月23日 二维数组
- 12月23日 周六
- 2015年6月23日-7月12日,进行54小时,剩3651小时
- 7月23日
- 6月23日
- 4月23日
- 递归创建目录
- JQuery中 input areatext select checkbox radio 取值方法
- 知名互联网公司系统工程师面试题
- Linux启动过程
- Linux 的档案系统( inode )
- 非前缀编码(2011年12月23日23:16:27)
- break和continue的区别
- Ada (一)
- C++算法(四)之最大优先级队列
- 自已写的几个分页的存储过程
- linux 软硬连接
- 搜狗漏洞事件背后的那只手
- date.timezone 设置默认地区时间
- 说自己