LeetCode 527. 单词缩写(Trie树)

news/2024/11/24 18:29:06/

文章目录

    • 1. 题目
    • 2. 解题

1. 题目

给定一个由n个不重复非空字符串组成的数组,你需要按照以下规则为每个单词生成最小的缩写

  • 初始缩写由起始字母+省略字母的数量+结尾字母组成。
  • 若存在冲突,亦即多于一个单词有同样的缩写,则使用更长的前缀代替首字母,直到从单词到缩写的映射唯一。换而言之,最终的缩写必须只能映射到一个单词。
  • 若缩写并不比原单词更短,则保留原样。
示例:
输入: ["like", "god", "internal", "me", "internet", "interval", "intension", "face", "intrusion"]
输出: ["l2e","god","internal","me","i6t","interval","inte4n","f2e","intr4n"]注意:
n和每个单词的长度均不超过 400。
每个单词的长度大于 1。
单词只由英文小写字母组成。
返回的答案需要和原数组保持同一顺序。

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/word-abbreviation
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • 对字符串进行分组(首尾字符+长度),这种情况,缩写才可能一样
  • 组内单词插入trie树,记录每个节点的占用次数,如果只出现1个人占用的,即可以确定唯一的缩写
class trie
{
public:trie* next[26] = {NULL};int freq = 0;void insert(string& s){trie* cur = this;for(int i = 0; i < s.size(); i++){if(!cur->next[s[i]-'a'])cur->next[s[i]-'a'] = new trie();cur = cur->next[s[i]-'a'];cur->freq++;}}
};
class Solution {
public:vector<string> wordsAbbreviation(vector<string>& dict) {unordered_map<string, vector<string>> group;unordered_map<string, int> w_id;for(int i = 0; i < dict.size(); ++i){string g = dict[i][0]+to_string(dict[i].size())+dict[i].back();group[g].push_back(dict[i]);//按首尾字符+长度信息给字符串分组w_id[dict[i]] = i;//序号信息}vector<string> ans(dict.size());for(auto& strs : group)//分组{trie* t = new trie(), *cur = t;for(auto& s : strs.second)t->insert(s);//组内单词插入trie树for(auto& s : strs.second)//遍历组内的单词{cur = t;string temp;//缩写for(int i = 0; i < s.size(); i++)//在trie中查找{if(cur->next[s[i]-'a']->freq == 1)//自己独有的字符{int count = s.size()-i-2;if(count >= 2)//缩写字符超过1个temp = s.substr(0,i+1)+to_string(count)+s.back();elsetemp = s;break;}cur = cur->next[s[i]-'a'];}ans[w_id[s]] = temp;}   }return ans;}
};

332 ms 330.2 MB


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!
Michael阿明


http://www.ppmy.cn/news/537740.html

相关文章

爆肝一月!527页文档详解SpringCloud微服务和分布式系统实践

所谓的分布式系统&#xff0c;就是一组计算机为了共同完成业务功能通过网络协作的多节点系统。分布式系统本身也有一系列需要解决的问题&#xff0c;包括多个计算机节点的路由选择、各个服务实例的管理、节点监控、节点之间的协作和数据一致性等&#xff0c;当然还有网络故障、…

527. 【消息队列】windows安装NSQ

nsq 是基于 Go语言开发出来的消息队列中间件&#xff0c;今天在windows上来安装一下基础环境。 一、下载可执行文件 点击下载 下载完成之后解压&#xff1a; 二、执行 nsqlookup nsqlookupd是管理拓扑信息的守护进程。客户端查询nsqlookupd以发现特定主题的nsqd生产者&…

【博客527】使用perf分析网络流量走向

使用perf分析网络流量走向 安装 perf sudo apt install linux-tools-generic跟踪 ping 包 sudo perf trace --no-syscalls --event ‘net:*’ ping 172.17.0.2 -c1 > /dev/null 0.000 net:net_dev_queue:devdocker0 skbaddr0xffff96d481988700 len98)0.008 net:net_dev_st…

【语音处理】基于matlab GUI语音时域频域频谱图分析【含Matlab源码 527期】

⛄一、语音处理简介 MATLAB GUI是用户与计算机或计算机程序的接触点或交互方式,是用户与计算机进行信息交流的方式。图形用户界面&#xff08;Graphical User Interfaces,GUI&#xff09;则是由窗口、光标、按键、菜单、文字说明等对象&#xff08;Object&#xff09;构成的一…

Vivado报错:[Runs 36-527] DCP does not exist,generate Output Products MIG ddr3 IP核后报错DCP问题解决

Vivado报错&#xff1a;[Runs 36-527] DCP does not exist_烦恼诗集#的博客-CSDN博客 先参考这个文档解决&#xff0c; 问题描述&#xff1a;综合工程时&#xff0c;某个IP文件被标红&#xff0c;出现[Runs 36-527] DCP does not exist...... 的报错 解决办法&#xff1a;如…

失眠一月码出527页文档,详解SpringCloud微服务和分布式系统实践

所谓的分布式系统&#xff0c;就是一组计算机为了共同完成业务功能通过网络协作的多节点系统。分布式系统本身也有一系列需要解决的问题&#xff0c;包括多个计算机节点的路由选择、各个服务实例的管理、节点监控、节点之间的协作和数据一致性等&#xff0c;当然还有网络故障、…

【软件工程导论】从已考完期末的角度记录软导常考内容

文章目录 软件工程概念软件过程模型&#xff08;了解&#xff09;软件生存周期划分数据流图内聚与耦合的种类UML中的主要图及其作用MVC模式MVVM模式黑盒测试白盒测试白盒测试法的逻辑覆盖标准 软件工程概念 什么是软件工程&#xff1f;它的目标和内容是什么&#xff1f; 软件工…

韩顺平java课程527 -531速记笔记

527 LinkedHashSet底层是一个LinkedHashMap&#xff0c; 底层维护了一个 数组双向链表 link代表链表 hashset的子类 LinkedHashSet 根据元素的hashcode值来决定元素的存储位置 维护元素的次序 &#xff08;使其想顺序插入&#xff09; 放在了不同的索引上 构建了双向链表 …