非前缀编码(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

//没有用什么库函数,主要是不熟悉,所以实现起来稍微复杂点。

 

 

原创粉丝点击