欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 建筑 > [Algorithm][综合训练][哈夫曼编码][abb][旋转字符串]详细讲解

[Algorithm][综合训练][哈夫曼编码][abb][旋转字符串]详细讲解

2024/10/25 3:28:10 来源:https://blog.csdn.net/qq_37281656/article/details/141652104  浏览:    关键词:[Algorithm][综合训练][哈夫曼编码][abb][旋转字符串]详细讲解

目录

  • 1.哈夫曼编码
    • 1.题目链接
    • 2.算法原理详解 && 代码实现
  • 2.abb
    • 1.题目链接
    • 2.算法原理详解 && 代码实现
  • 3.旋转字符串
    • 1.题目链接
    • 2.算法原理详解 && 代码实现


1.哈夫曼编码

1.题目链接

  • 哈夫曼编码

2.算法原理详解 && 代码实现

  • 哈夫曼编码:核心 -> 让出现次数越多的字符编出来的码越短

    • 是什么:最优的压缩方式
    • 怎么用
      • 统计每个字符的频次
      • 根据频次构建最优二叉树
      • 根据最优二叉树编码
        请添加图片描述
  • 解法:利用小根堆,一边构建树,一边计算长度

    #include <iostream>
    #include <vector>
    #include <queue>
    using namespace std;typedef long long LL;int main()
    {int n = 0;cin >> n;priority_queue<LL, vector<LL>, greater<>> heap;while(n--){LL x = 0;cin >> x;heap.push(x);}// 构建最优二叉树/哈夫曼树LL ret = 0;while(heap.size() > 1){LL x1 = heap.top();heap.pop();LL x2 = heap.top();heap.pop();heap.push(x1 + x2);ret += x1 + x2;}cout << ret << endl;return 0;
    }
    

2.abb

1.题目链接

  • abb

2.算法原理详解 && 代码实现

  • 解法:动态规划 + 哈希表 -> 子序列问题 -> 以某个位置为结尾来分析问题
    • 状态表示dp[i]:以i位置元素为结尾的所有的子序列中,有多少个_xx

    • 状态转移方程
      请添加图片描述

    • 返回值:整张dp表的和

    #include <iostream>
    #include <string>
    using namespace std;int main()
    {int n = 0;string str;cin >> n >> str;long long f[26] = { 0 };long long g[26] = { 0 };long long ret = 0;for(int i = 0; i < n; i++){// DPint x = str[i] - 'a';ret += f[x];// Updatef[x] = f[x] + i - g[x];g[x] = g[x] + 1;}cout << ret << endl;return 0;
    }
    

3.旋转字符串

1.题目链接

  • 旋转字符串

2.算法原理详解 && 代码实现

  • 解法一:暴力模拟 --> 每次旋转⼀下A字符串,看看是否和B字符串相同
  • 解法二:规律 + string接口
    • 如果A能够旋转之后得到B的话,在A倍增之后的新串中,⼀定是可以找到B的
    • 因此,仅需让A倍增,然后查找B即可
    bool solve(string A, string B)
    {if(A.size() != B.size()){return false;}return (A + A).find(B) != string::npos;
    }
    

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com