咸鱼程序员之-算法第一篇-字符串暴力匹配算法

hello ,本咸鱼这节给大家分享一下字符串匹配算法之-暴力匹配算法。

虽说这种算法不是特别好,但总归能解决问题。ok 。直接上代码:

 

这里小编有觉得有几个注意点。

1.边界问题:

因为你的数组是从0开始遍历,所以i一定不能等于数组的长度,否则就会越界。

 

2.返回的下标

这个下标是i-j  不要把j 理解成数组的长度奥

ok 我们来测试一下:

 

 

okay ,结果正确。这个算法一般不推荐面试的时候去说或者写,面试官会觉得你不懂算法。下节小编将分享经典的kmp算法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,这是一个比较复杂的问题,需要分多个步骤来实现。我会尽力解答,但是由于长度限制,可能无法提供完整的代码实现,还请谅解。 首先,需要了解哈夫曼编码的基本原理。哈夫曼编码是一种变长编码方式,将出现频率较高的字符用较短的编码表示,出现频率较低的字符用较长的编码表示,以达到压缩数据的目的。在哈夫曼编码中,使用哈夫曼树来表示每个字符的编码。 接下来,我们可以按照以下步骤来实现哈夫曼编译器: 1. 定义一个结构体来表示每个字符及其出现的概率: ``` typedef struct { char ch; // 字符 float prob; // 出现概率 char code[256]; // 哈夫曼编码 } HuffmanNode; ``` 2. 编写一个函数来统计输入字符串中每个字符出现的概率,并将结果存储在一个数组中: ``` void calc_prob(char *str, HuffmanNode *nodes, int *count) { int len = strlen(str); for (int i = 0; i < len; i++) { char ch = str[i]; count[ch]++; } for (int i = 0; i < 256; i++) { if (count[i] > 0) { nodes[*num_nodes].ch = i; nodes[*num_nodes].prob = (float)count[i] / len; (*num_nodes)++; } } } ``` 3. 构建哈夫曼树,按照字符出现概率从小到大排序,并将概率较小的字符作为叶子节点,概率较大的字符作为根节点: ``` void build_tree(HuffmanNode *nodes, int num_nodes) { for (int i = 0; i < num_nodes - 1; i++) { int min1 = -1, min2 = -1; for (int j = 0; j < num_nodes; j++) { if (nodes[j].parent == -1) { if (min1 == -1 || nodes[j].prob < nodes[min1].prob) { min2 = min1; min1 = j; } else if (min2 == -1 || nodes[j].prob < nodes[min2].prob) { min2 = j; } } } nodes[min1].parent = num_nodes + i; nodes[min2].parent = num_nodes + i; nodes[num_nodes + i].left = min1; nodes[num_nodes + i].right = min2; nodes[num_nodes + i].prob = nodes[min1].prob + nodes[min2].prob; } } ``` 4. 根据哈夫曼树生成每个字符的哈夫曼编码: ``` void generate_code(HuffmanNode *nodes, int root, char *buffer, int depth) { if (nodes[root].left == -1 && nodes[root].right == -1) { buffer[depth] = '\0'; strcpy(nodes[root].code, buffer); return; } buffer[depth] = '0'; generate_code(nodes, nodes[root].left, buffer, depth + 1); buffer[depth] = '1'; generate_code(nodes, nodes[root].right, buffer, depth + 1); } ``` 5. 输入任意字符串,将每个字符编码,并输出译码结果: ``` void encode_string(char *str, HuffmanNode *nodes, int num_nodes) { int len = strlen(str); for (int i = 0; i < len; i++) { char ch = str[i]; for (int j = 0; j < num_nodes; j++) { if (nodes[j].ch == ch) { printf("%s", nodes[j].code); break; } } } printf("\n"); } ``` 以上是一个基本的哈夫曼编译器的实现步骤,具体实现细节还需要根据实际情况进行调整和完善。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值