给定一个单词列表,我们将这个列表编码成一个索引字符串 S 与一个索引列表 A。
例如,如果这个列表是 ["time", "me", "bell"],我们就可以将其表示为 S = "time#bell#" 和 indexes = [0, 2, 5]。
对于每一个索引,我们可以通过从字符串 S 中索引的位置开始读取字符串,直到 "#" 结束,来恢复我们之前的单词列表。
那么成功对给定单词列表进行编码的最小字符串长度是多少呢?
 
示例:
输入: words = ["time", "me", "bell"]
输出: 10
说明: S = "time#bell#" , indexes = [0, 2, 5] 。

 
提示:

 1 <= words.length <= 2000
 1 <= words[i].length <= 7
 每个单词都是小写字母 。
 
思路:先把每个字符串都逆序,然后再根据字典序排序,假如“time”,“lime”,“hell”,“sometime”,“shell”,“me”。
逆序后:“emit”,“emil”,“lleh”,“emitemos”,“llehs”,“em”
按照字典序排序:“em”,“emil”,“emit”,“emitemos”,“lleh”,“llehs”
然后只需要判断当前是否为后一个单词的前缀(红色的是后一个单词的前缀),如果是前缀则减去当前单词的长度,以及一个‘#’。
 
通过这道题学习到的东西:
1.字符串只能在定义的时候可以直接赋值,例如:char *s = “time”  或者char s[10] = "time",不能定义完后再用“=”赋值,如果这样得到字符串是只读,不能修改,需要用到strcpy
strcpy(str1,“time”),把time赋值给str1,并且自带'\0';
2.判断前缀可以用strncmp函数
int strncmp ( const char * str1, const char * str2, size_t n ),比较前n个字节,如果前n个字符相等,则返回0,如果str1>str2则返回大于0的值,否则返回小于0的值。
3.主函数中的二维数组只能用指针传到被调用的函数中,即char **a,才行,char[n][n]不行。
4.c语言qsort与sort函数都可排成字典序。
5.calloc函数可以申请空间同时将数组初始化为0
 1 #include<stdio.h>
2 #include<string.h>
3 #include<stdlib.h>
4
5 int Cmp(const void* a, const void* b)
6 {
7 char* s1 = *(char**)a;
8 char* s2 = *(char**)b;
9
10 return strcmp(s1, s2);
11 }
12
13 int minimumLengthEncoding(char** words, int wordsSize)
14 {
15 if (words == NULL || wordsSize == 0)
16 {
17 return 0;
18 }
19 int i, j,res = 0;
20 int totalLen = 0;
21 int* size = (int*)calloc(wordsSize, sizeof(int));
22 char t[9] = { 0 };
23
24 for (i = 0; i < wordsSize; i++) //每个字符串逆序
25 {
26 int len = strlen(words[i]);
27 for (j = 0; j < len / 2; j++)
28 {
29 char t = words[i][j];
30 words[i][j] = words[i][len-j-1];
31 words[i][len-j-1] = t;
32 }
33 }
34 qsort(words, wordsSize, sizeof(char*), Cmp); //字符串字典序排序
35 /*for (i = 0; i < wordsSize-1; i++) //冒泡排序
36 {
37 for (j = 0; j < wordsSize - 1 - i; j++)
38 {
39 if (strcmp(words[j], words[j + 1]) > 0)
40 {
41 strcpy(t, words[j]);
42 strcpy(words[j], words[j + 1]);
43 strcpy(words[j + 1], t);
44 }
45 }
46 }*/
47
48 for (i = 0; i < wordsSize; i++) //总长度,并记录每个串个长度
49 {
50 size[i] = strlen(words[i]);
51 totalLen += size[i];
52 }
53 totalLen += wordsSize; //加所有的'#'
54
55 for (i = 0; i < wordsSize - 1; i++)
56 {
57 if (strncmp(words[i], words[i + 1], size[i]) == 0)
58 {
59 totalLen -= (size[i] + 1);
60 }
61 }
62 free(size);
63 return totalLen;
64 }
65
66 int main(void)
67 {
68 char** s;
69 int num;
70 s = (char **)malloc(sizeof(char*) * 6);
71 for (int i = 0; i < 6; i++)
72 {
73 s[i] = (char *)malloc(sizeof(char) * 10);
74 }
75 strcpy(s[0], "time");
76 strcpy(s[1], "lime");
77 strcpy(s[2], "hell");
78 strcpy(s[3], "sometime");
79 strcpy(s[4], "shell");
80 strcpy(s[5], "me");
81
82 num = minimumLengthEncoding(s, 6);
83 printf("%d", num);
84 return 0;
85 }
 
 

(Good topic)单词的压缩编码(leetcode3.28每日打卡)的更多相关文章

  1. Java实现 LeetCode 820 单词的压缩编码(暴力)

    820. 单词的压缩编码 给定一个单词列表,我们将这个列表编码成一个索引字符串 S 与一个索引列表 A. 例如,如果这个列表是 ["time", "me", & ...

  2. Java实现 LeetCode 820 单词的压缩编码(字典树)

    820. 单词的压缩编码 给定一个单词列表,我们将这个列表编码成一个索引字符串 S 与一个索引列表 A. 例如,如果这个列表是 ["time", "me", & ...

  3. leetcode之820. 单词的压缩编码 | python极简实现字典树

    题目 给定一个单词列表,我们将这个列表编码成一个索引字符串 S 与一个索引列表 A. 例如,如果这个列表是 ["time", "me", "bell& ...

  4. 2018/1/28 每日一学 单源最短路的SPFA算法以及其他三大最短路算法比较总结

    刚刚AC的pj普及组第四题就是一种单源最短路. 我们知道当一个图存在负权边时像Dijkstra等算法便无法实现: 而Bellman-Ford算法的复杂度又过高O(V*E),SPFA算法便派上用场了. ...

  5. [Swift]LeetCode820. 单词的压缩编码 | Short Encoding of Words

    Given a list of words, we may encode it by writing a reference string S and a list of indexes A. For ...

  6. python set() leetcode 签到820. 单词的压缩编码

    题目 给定一个单词列表,我们将这个列表编码成一个索引字符串 S 与一个索引列表 A. 例如,如果这个列表是 ["time", "me", "bell& ...

  7. 【LeetCode】820. 单词的压缩编码 Short Encoding of Words(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址:https://leetcode-cn.com/problems/short- ...

  8. 2018/03/28 每日一个Linux命令 之 mkdir/rmdir

    用于建立空文件夹和删除文件夹 -- 两命令重要参数 -p 递归建立/删除 -- 例如 mkdir -p demo1/demo2/demo3 建立demo3空文件夹,如果demo1/demo2没建立也建 ...

  9. P1664 每日打卡心情好

    题目背景 在洛谷中,打卡不只是一个简单的鼠标点击动作,通过每天在洛谷打卡,可以清晰地记录下自己在洛谷学习的足迹.通过每天打卡,来不断地暗示自己:我又在洛谷学习了一天,进而帮助自己培养恒心.耐心.细心. ...

  10. (leetcode每日打卡)秋叶收藏集【动态规划】

    LCP 19.秋叶收藏集 题目链接 算法 动态规划 时间复杂度O(n) 1.题目要求最终形成[红.黄.红]三部分,每部分数量可以不相等,问最终调整操作数量最小是多少.这道题一开始考虑暴力去做,枚举两个 ...

随机推荐

  1. 如何编写难以维护的React代码?耦合组件

    如何编写难以维护的React代码?耦合组件 在许多项目中,我们经常会遇到一些难以维护的React代码.其中一种常见的情况是:子组件直接操作父组件方法,从而导致父子组件深度耦合.这样的实现让子组件过于依 ...

  2. java读取txt文件解决乱码问题

    说明:由于txt文件有bom和不同的编码方式,导致导入数据时产生乱码,以下代码完美解决乱码问题. 参考他人代码,结合自己的业务加工完成,费了大半天功夫完成,希望对大家有点用处. 废话不多说,直接上代码 ...

  3. pyqt5中的布局方法

    addLayout():用于在布局中插入子布局 addWidget():用于在布局中插入控件

  4. CVE-2020-0796 SMB远程代码执行漏洞复现

    前言: 这个windows的永恒之黑漏洞,不得不复现一下啦! 这个漏洞诸多大佬都已经复现了,现在跟随大佬的脚步,逐个复现一下: 可参考:https://www.adminxe.com/1220.htm ...

  5. go-zero 是如何做路由管理的?

    原文链接: go-zero 是如何做路由管理的? go-zero 是一个微服务框架,包含了 web 和 rpc 两大部分. 而对于 web 框架来说,路由管理是必不可少的一部分,那么本文就来探讨一下 ...

  6. SpringCloudAlibaba框架学习

    遇到问题找了各种办法都没有解决,就reload maven,再不行就重启idea,重启电脑.(有奇效,我好几次就这么解决的,可能是我电脑配置太拉了) 注册中心 - Nacos 配置文件优先级:本地配置 ...

  7. Pytest+Jenkins 学习笔记

    Pytest+Jenkins 学习笔记 在软件测试工作中,单元测试通常是由开发人员执行的.针对最小单元粒度的组件测试,在完成了单元粒度的测试任务之后,通常就需要交由专职的测试人员将这些单元级的组件放到 ...

  8. 《Python魔法大冒险》010 魔法宝箱:列表与元组的探险

    城堡的大门 随着小鱼和魔法师的深入,他们来到了一个古老的废弃城堡.城堡的大门上挂着一个巨大的锁,而锁的旁边有一排小抽屉,每个抽屉里都有一个物品. 魔法师对小鱼说:"这是一个古老的魔法宝箱,小 ...

  9. Web攻防--Java_SQL注入--XXE注入-- SSTI模板注入--SPEL表达式注入

    预编译 编译器在编译sql语句时,会依次进行词法分析.语法分析.语义分析等操作, 预编译技术会让数据库跳过编译阶段,也就无法就进行词法分析,关键字不会被拆开,注入语句也就不会被识别为SQL的关键字,从 ...

  10. IOS苹果应用IPA重签名软件手机版(苹果重签名,企业签名,安卓苹果平台,时间控制)

    软件简介 IOS苹果应用IPA重签名软件手机版,可以在安卓或者苹果手机上,苹果应用IPA文件重新签名,无需MAC苹果电脑和配置XCODE开发环境,便可以直接对IPA文件进行签名,签名在本地进行,不消耗 ...