748. 最短完整词『简单』

Posted zhiyin1209

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了748. 最短完整词『简单』相关的知识,希望对你有一定的参考价值。

题目来源于力扣(LeetCode

一、题目

748. 最短完整词

题目相关标签:哈希表

技术图片

提示:

  • 牌照(licensePlate)的长度在区域[1, 7]中。
  • 牌照(licensePlate)将会包含数字、空格、或者字母(大写和小写)。
  • 单词列表(words)长度在区间 [10, 1000] 中。
  • 每一个单词 words[i] 都是小写,并且长度在区间 [1, 15] 中。

二、解题思路

  1. 对 licensePlate 字符串中的字母字符元素进行哈希映射,键为字母对应的索引,值为字母出现的次数

  2. 遍历 words 数组,对于数组中的每个元素也进行哈希映射

  3. 两个哈希映射的数组进行次数的比较,当前遍历单词的哈希映射包含了 licensePlate 中的全部字母字符时,说明该单词可能为完整词

  4. 当前遍历的单词为完整词且字符串长度小于已记录的最短完整词长度时,当前单词成为新的最短完整词

三、代码实现

public static String shortestCompletingWord(String licensePlate, String[] words) {
    int[] letters = new int[26];
    String ans = "";
    // licensePlate 字符串中字母字符映射
    letterMap(licensePlate, letters);
    int len = Integer.MAX_VALUE;

    for (int i = 0; i < words.length; i++) {
        int[] wordLetters = new int[26];
        String str = words[i];
        // 长度大于等于最短完整词时,continue
        if (str.length() >= len) {
            continue;
        }
        // str 字符串中字母字符映射
        letterMap(str, wordLetters);
        for (int m = 0; m < letters.length; m++) {
            // str 字符串中是否包含 licensePlate 中的全部字母字符
            if (wordLetters[m] < letters[m]) {
                break;
            }
            // 当前遍历字符串包含 licensePlate 中的全部字母字符,且字符串长度小于最短完整词的长度时
            if (m == letters.length - 1 && str.length() < len) {
                // 当前遍历字符串成为新的最短完整词,并修改长度
                ans = str;
                len = str.length();
            }
        }
    }
    return ans;
}

// 字符串中的字母字符映射到哈希数组中
public static void letterMap(String str, int[] arr) {
    for (int i = 0; i < str.length(); i++) {
        char j = str.charAt(i);
        if (j >= ‘A‘ && j <= ‘Z‘) {
            // 大写字母 + 32 成小写字母
            arr[j + 32 - ‘a‘] += 1;
        } else if (j >= ‘a‘ && j <= ‘z‘) {
            arr[j - ‘a‘] += 1;
        }
    }
}

四、执行用时

技术图片

五、部分测试用例

public static void main(String[] args) {
    String licensePlate = "1s3 PSt";
    String[] words = {"step", "steps", "stripe", "stepple"};  // output: "steps"?

//    String licensePlate = "1s3 456";
//    String[] words = {"looks", "pest", "stew", "show"};  // output: "pest"

    String result = shortestCompletingWord(licensePlate, words);
    System.out.println(result);
}

以上是关于748. 最短完整词『简单』的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode748 最短补全词[数组 字母] HERODING的LeetCode之路

LeetCode 748. 最短补全词 / 911. 在线选举 / 709. 转换成小写字母

LeetCode - 748. 最短补全词 - java

解题报告Leecode 748. 最短补全词——Leecode每日一题系列

解题报告Leecode 748. 最短补全词——Leecode每日一题系列

VSCode自定义代码片段——git命令操作一个完整流程