leetcode - 527. Word Abbreviation

这篇具有很好参考价值的文章主要介绍了leetcode - 527. Word Abbreviation。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Description

Given an array of distinct strings words, return the minimal possible abbreviations for every word.

The following are the rules for a string abbreviation:

  1. The initial abbreviation for each word is: the first character, then the number of characters in between, followed by the last character.
  2. If more than one word shares the same abbreviation, then perform the following operation:
    • Increase the prefix (characters in the first part) of each of their abbreviations by 1.
      • For example, say you start with the words [“abcdef”,“abndef”] both initially abbreviated as “a4f”. Then, a sequence of operations would be [“a4f”,“a4f”] -> [“ab3f”,“ab3f”] -> [“abc2f”,“abn2f”].
    • This operation is repeated until every abbreviation is unique.
  3. At the end, if an abbreviation did not make a word shorter, then keep it as the original word.

Example 1:

Input: words = ["like","god","internal","me","internet","interval","intension","face","intrusion"]
Output: ["l2e","god","internal","me","i6t","interval","inte4n","f2e","intr4n"]

Example 2:

Input: words = ["aa","aaa"]
Output: ["aa","aaa"]

Constraints:

1 <= words.length <= 400
2 <= words[i].length <= 400
words[i] consists of lowercase English letters.
All the strings of words are unique.

Solution

Just code intuitively… Write a function for doing the abbreviation, and then use a dict, with the key as the abbreviation, and value as the list of common words indexes. Every time add the list with length 1, and keep expanding those list with length more than 1.文章来源地址https://www.toymoban.com/news/detail-820516.html

Code

class Solution:
    def wordsAbbreviation(self, words: List[str]) -> List[str]:
        def abbrev(s: str, prefix_len: int) -> str:
            abbr = f'{s[:prefix_len]}{len(s) - prefix_len - 1}{s[-1]}'
            if len(abbr) >= len(s):
                abbr = s
            return abbr
        # key: abbr, value: [index1, index2, ...]}
        abbr_info = {}
        cur_prefix = 1
        # init abbr_info
        for i in range(len(words)):
            abbr = abbrev(words[i], cur_prefix)
            if abbr not in abbr_info:
                abbr_info[abbr] = []
            abbr_info[abbr].append((i, abbr))
        res = []
        while abbr_info:
            new_abbr_info = {}
            cur_prefix += 1
            for each_abbr, same_list in abbr_info.items():
                if len(same_list) == 1:
                    res.append(same_list[0])
                else:
                    for index, _ in same_list:
                        new_abbr = abbrev(words[index], cur_prefix)
                        if new_abbr not in new_abbr_info:
                            new_abbr_info[new_abbr] = []
                        new_abbr_info[new_abbr].append((index, new_abbr))
            abbr_info = new_abbr_info
        res.sort(key=lambda x:x[0])
        return list(item[1] for item in res)

到了这里,关于leetcode - 527. Word Abbreviation的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 链表OJ题目1 (移除链表元素)

    力扣(链接放这里喽)  先贴代码再做讲解:     我们应该先将情况考虑周全,画图分析思路 : 我们假设有上述这种情况,按照题目设想,前面三个6都应该free掉,从3这个位置开始,也就是说我们要返回的头就从此处开始,所以我们先考虑值相等,过掉再继续。 在这个位

    2024年02月12日
    浏览(43)
  • 王道机试指南(第二版)——题目OJ链接

    王道机试指南(第二版)——题目OJ链接 方便大家跳转检验,侵删。 题目 地址 例题2.1 abc(清华大学复试上机题) 例题2.2 反序数(清华大学复试上机题) 例题2.3 对称平方数1(清华大学复试上机题) 习题2.1 与7无关的数(北京大学复试上机题) 习题2.2 百鸡问题(北京哈尔

    2024年01月17日
    浏览(47)
  • 二叉树OJ题目合集(单值、对称、平衡、构建加遍历)

    目录 前言: 一:单值二叉树 二:二叉树遍历 核心点 (1)前序 (2)中序 (3)后序 三:判断两颗树是否相同 四:判断二叉树是否对称 五:判断一颗树是否为另一颗树的子树 六:平衡二叉树 七:二叉树的构建加遍历 这一部分适合已经 适用于已经掌握二叉树基础的同学(遍历,求节

    2024年02月02日
    浏览(37)
  • 【数据结构】二叉树的相关操作以及OJ题目

    当一个树不是满二叉树或完全二叉树时,它是不适合使用数组存储的,它应该使用链式结构来存储。 再看二叉树基本操作前,再回顾下二叉树的概念,二叉树是: 空树 非空:根节点,根节点的左子树、根节点的右子树组成的。 从概念中可以看出,二叉树定义是递归式的,因

    2024年03月19日
    浏览(48)
  • C++类相关oj题目分享(计算日期到天数转换、日期差值、打印日期、日期累加)

    传送门 首先我们知道肯定是用一个数组来储存每个月的天数,更加方便。同时默认2月是28天,如果是闰年就是29。 总体的计算思路是: 1 月到 month-1 月的所有天数,加上 month 月的 day 。使用for循环能正好契合这个思路 当然这题的思路和解法非常多,我这也只是其中一个。 传

    2024年01月20日
    浏览(38)
  • 数据结构:线性表————顺序表的实现、项目和OJ题目(手把手教你写代码)

    🌈 个人主页: 小新_- 🎈个人座右铭:“成功者不是从不失败的人,而是从不放弃的人!”🎈 🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝 🏆所属专栏:  话说那些与C++的爱恨情仇   欢迎订阅,持续更新中~~~                                           ✨让小新带着你

    2024年04月16日
    浏览(104)
  • 链表OJ(LeetCode)

    法一:遍历删除 法二:循环尾插 法三:带哨兵位的头结点 法一:循环头插 法二:改变指针指向 法一:归并插入 法二:带哨兵位的头结点 n是偶数能追上 n是奇数 C-1是偶数能追上 n是奇数 C-1是奇数追不上 slow进环后在一圈内一定会被fast追上:slow进环后 fast一定在slow前面 二者

    2024年02月16日
    浏览(31)
  • 经典LeetCode在线OJ习题

    目录 习题一:移除元素 (一)、题目  (二)、示例 (三)、解题思路 思路一: 思路一源代码: 源代码解释: 思路二:(最标准最适用) 思路二源代码: 源代码解释:  习题二:归并两个有序数组 (一)、题目  (二)、示例 (三)、解题思路  思路一:暴力求解但

    2024年02月10日
    浏览(40)
  • Leetcode-二叉树oj题

    144. 二叉树的前序遍历 https://leetcode.cn/problems/binary-tree-preorder-traversal/ 这个题目在遍历的基础上还要求返回数组,数组里面按前序存放二叉树节点的值。 既然要返回数组,就必然要malloc一块空间,那么我们需要算出这个二叉树的节点个数,所以就创建一个函数TreeSize求出节点

    2024年02月05日
    浏览(37)
  • 顺序表链表OJ题(1)——【LeetCode】

    W...Y的主页 😊 代码仓库分享 💕  前言: 今天我们来回顾一下顺序表与链表,针对这一块我们也有许多OJ题目供大家参考。当我们学习完顺序表链表后避免不了一些习题的练习,这样才能巩固我们学习的内容。 话不多说,我们开始进入OJ习题训练!!! 【leetcode 27.移除元素

    2024年02月10日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包