前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode 527. 单词缩写(Trie树)

LeetCode 527. 单词缩写(Trie树)

作者头像
Michael阿明
发布2021-02-19 11:02:53
6420
发布2021-02-19 11:02:53
举报
文章被收录于专栏:Michael阿明学习之路

文章目录

1. 题目

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

  • 初始缩写由起始字母+省略字母的数量+结尾字母组成。
  • 若存在冲突,亦即多于一个单词有同样的缩写,则使用更长的前缀代替首字母,直到从单词到缩写的映射唯一。换而言之,最终的缩写必须只能映射到一个单词。
  • 若缩写并不比原单词更短,则保留原样。
代码语言:javascript
复制
示例:
输入: ["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个人占用的,即可以确定唯一的缩写
代码语言:javascript
复制
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();
                        else
                            temp = s;
                        break;
                    }
                    cur = cur->next[s[i]-'a'];
                }
                ans[w_id[s]] = temp;
            }   
        }
        return ans;
    }
};

332 ms 330.2 MB

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/08/12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 1. 题目
  • 2. 解题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档