非前缀编码(2011年12月23日23:16:27)

 //问题描述

 

/*
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 Input

2
01 10 0010 0000
01 10 010 0000


Sample Output

Yes
No
*/


//头文件以及函数申明

 

#include<stdio.h>
#include<string.h>
#define MAX 1000

int 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

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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值