复习了下哈夫曼树:
哈夫曼树口诀:
1.构造森林全是根
2.选用两小造新人
3.删除两小添新人
4.重复23剩单根
小注意:哈夫曼树中的节点度数为0或2,并没有1
包含n个叶子节点的哈夫曼树一共有2n-1个节点
且包含n个节点的哈夫曼树要经过n-1次合并才能得到哈夫曼树。
并且这n-1个产生的节点都具有两个孩子的分支节点
typedef struct node
{
int weight;
int parent;
int lch,rch;
}HTNode , *HuffmanTree;
void CreatHuffmanTree(HuffmanTree HT, int n)
{
if(n <= 1)
return ;
int num = 2*n-1;//一共2n-1个数组
int s1,s2;
HT = new HTNode[m+1];
//初始化数据
for(int i=1;i<=num;i++)
{
HT[i].lch=0,HT[i].rch=0,HT[i].parent=0;
}
//输入每个节点的权值
for(int i=1;i<=n;i++)
{
scanf("%d",&HT[i].weight);
}
//对哈夫曼树进行合并
for(int i=n+1;i<=num;i++)
{
findMin(HT,i-1,&s1,&s2);
//在HT[k](1<=k<=i-1)中选择两个其双亲节点为0,
//并且权值最小的节点,返回它们的序号s1和s2
HT[s1].parent=i;HT[s2].parent=i;
//给其双亲赋值,并表示从数组比较中删除了
HT[i].lch=s1;HT[i].rch=s2;
//s1,s2分别作为i的左右孩子
HT[i].weight=HT[s1].weight+HT[s2].weight;
//i的权值就是左右孩子权值的和
}
}
难度中等
111
给定一个二进制字符串 s 和一个正整数 n,如果对于 [1, n] 范围内的每个整数,其二进制表示都是 s 的 子字符串 ,就返回 true,否则返回 false 。
子字符串 是字符串中连续的字符序列。
示例 1:
输入:s = "0110", n = 3输出:true
示例 2:
输入:s = "0110", n = 4输出:false
用字符串比较,在一次遍历暴力解决即可,
strstr:
strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回 str1字符串从 str2第一次出现的位置开始到 str1结尾的字符串;否则,返回NULL。
自己写了个strstr,一开始不知道可以直接调用,调用之后更方便。
int strstr(char *ch1,char *ch2)
{
int len1,len2;
len1 = strlen(ch1);
len2 = strlen(ch2);
for(int i = 0; i < len1 ; i++)
{
int s = 0;
while(s < len2)
if(ch2[s] != ch1[s+i])
continue;
if(s >= len2)
return 1;
}
return 0;
}
void i_to_b(char* s, int num)
{
int len = 0;
while(num > 0)
{
s[len++] = '0' + (num & 1);
num /= 2;
}
s[len] = '\0';
int left = 0;
len--;
while(left < len)
{
char temp = s[len];
s[len] = s[left];
s[left] = temp;
len--;
left++;
}
}
bool queryString(char * s, int n)
{
char bin[32];
for( int i = 1; i <= n; i++ )
{
i_to_b(bin , i);
if( strstr(s , bin) == NULL )
return false;
}
return true;
}