当前位置: 面试刷题>> 单词缩写集 (经典算法题500道)


题目描述补充

题目:单词缩写集

给定一个字符串数组 words,其中每个字符串代表一个单词。要求编写一个函数,该函数接收 words 数组作为输入,并返回一个包含所有单词缩写的集合(不重复),缩写规则如下:

  • 单词缩写仅保留首字母和尾字母,如果单词仅有两个字符长,则缩写就是它本身。
  • 如果单词包含中间的重复字符(如 "aa"),则这些重复字符在缩写中仅保留一个。
  • 结果集合中的缩写需按照它们在 words 数组中出现的顺序进行排序,并且不重复。

示例输入

words = ["internationalization", "zoom", "leetcode", "word", "keys"]

示例输出

["i1n", "zo", "l3e", "wrd", "ks"]

解释

  • "internationalization" 缩写为 "i1n"(首字母 'i',中间非重复字符 '1' 代表中间的长度,尾字母 'n')。
  • "zoom" 缩写为 "zo"(因为它只有两个字符)。
  • "leetcode" 缩写为 "l3e"('l' 是首字母,'3' 表示中间有三个字符,'e' 是尾字母)。
  • "word" 缩写为 "wrd"(去除中间的 'o' 因为它是重复的)。
  • "keys" 缩写为 "ks"(直接取首尾字母)。

PHP 示例代码

function abbreviateWords($words) {
    $abbrevs = [];
    foreach ($words as $word) {
        $length = strlen($word);
        if ($length <= 2) {
            $abbrevs[] = $word;
        } else {
            $first = $word[0];
            $last = $word[$length - 1];
            $middle = '';
            $prevChar = $first;
            for ($i = 1; $i < $length - 1; $i++) {
                if ($word[$i] != $prevChar) {
                    $middle .= '1';
                    $prevChar = $word[$i];
                }
            }
            $abbrevs[] = $first . strlen($middle) . $last;
        }
    }
    $abbrevs = array_unique($abbrevs);
    sort($abbrevs);
    return $abbrevs;
}

// 示例
$words = ["internationalization", "zoom", "leetcode", "word", "keys"];
print_r(abbreviateWords($words));

Python 示例代码

def abbreviate_words(words):
    abbrevs = []
    for word in words:
        length = len(word)
        if length <= 2:
            abbrevs.append(word)
        else:
            middle_count = sum(1 for i in range(1, length - 1) if word[i] != word[i - 1])
            abbrevs.append(word[0] + str(middle_count) + word[-1])
    return sorted(set(abbrevs))

# 示例
words = ["internationalization", "zoom", "leetcode", "word", "keys"]
print(abbreviate_words(words))

JavaScript 示例代码

function abbreviateWords(words) {
    const abbrevs = [];
    for (const word of words) {
        const length = word.length;
        if (length <= 2) {
            abbrevs.push(word);
        } else {
            let middleCount = 0;
            let prevChar = word[0];
            for (let i = 1; i < length - 1; i++) {
                if (word[i] !== prevChar) {
                    middleCount++;
                    prevChar = word[i];
                }
            }
            abbrevs.push(word[0] + middleCount + word[length - 1]);
        }
    }
    return [...new Set(abbrevs)].sort();
}

// 示例
const words = ["internationalization", "zoom", "leetcode", "word", "keys"];
console.log(abbreviateWords(words));

码小课网站中有更多关于算法和数据结构的精彩内容,欢迎大家前去学习交流。

推荐面试题