LeetCode114--词典中最长的单词、最短补全词、宝石与石头

1、词典中最长的单词

//给出一个字符串数组words组成的一本英语词典。从中找出最长的一个单词,该单词是由words词典中其他单词逐步添加一个字母组成。若其中有多个可行的答案,则返
//回答案中字典序最小的单词。 
//
// 若无答案,则返回空字符串。 
//
// 
//
// 示例 1: 
//
// 输入:
//words = ["w","wo","wor","worl", "world"]
//输出:"world"
//解释: 
//单词"world"可由"w", "wo", "wor", 和 "worl"添加一个字母组成。
// 
//
// 示例 2: 
//
// 输入:
//words = ["a", "banana", "app", "appl", "ap", "apply", "apple"]
//输出:"apple"
//解释:
//"apply"和"apple"都能由词典中的单词组成。但是"apple"的字典序小于"apply"。
// 
//
// 
//
// 提示: 
//
// 
// 所有输入的字符串都只包含小写字母。 
// words数组长度范围为[1,1000]。 
// words[i]的长度范围为[1,30]。 
// 
// Related Topics 字典树 哈希表

先不管三七二十一,找到最长的再说,然后再看看是不是符合由逐步增加一个字母而产生。

public String longestWord(String[] words) {
        String ans = "";
        Set wordset = new HashSet<>();
        for(String word:words) wordset.add(word);
        for (String word:words) {
            if(word.length()>ans.length() || word.length() == ans.length() &&
            word.compareTo(ans) < 0){
                boolean good = true;
                for (int i = 1; i < word.length(); i++) {
                    if(!wordset.contains(word.substring(0, i))){
                        good = false;
                        break;
                    }
                }
                if(good) ans = word;
            }
        }
        return ans;
    }

 2、最短补全词

//给定一个字符串牌照 licensePlate 和一个字符串数组 words ,请你找出并返回 words 中的 最短补全词 。 
//
// 如果单词列表(words)中的一个单词包含牌照(licensePlate)中所有的字母,那么我们称之为 补全词 。在所有完整词中,最短的单词我们称之为 最
//短补全词 。 
//
// 单词在匹配牌照中的字母时要: 
//
// 
// 忽略牌照中的数字和空格。 
// 不区分大小写,比如牌照中的 "P" 依然可以匹配单词中的 "p" 字母。 
// 如果某个字母在牌照中出现不止一次,那么该字母在补全词中的出现次数应当一致或者更多。 
// 
//
// 例如:licensePlate = "aBc 12c",那么它由字母 'a'、'b' (忽略大写)和两个 'c' 。可能的 补全词 是 "abccdef"
//、"caaacab" 以及 "cbca" 。 
//
// 题目数据保证一定存在一个最短补全词。当有多个单词都符合最短补全词的匹配条件时取单词列表中最靠前的一个。 
//
// 
//
// 示例 1: 
//
// 输入:licensePlate = "1s3 PSt", words = ["step", "steps", "stripe", "stepple"]
//输出:"steps"
//说明:最短补全词应该包括 "s"、"p"、"s" 以及 "t"。在匹配过程中我们忽略牌照中的大小写。
//"step" 包含 "t"、"p",但只包含一个 "s",所以它不符合条件。
//"steps" 包含 "t"、"p" 和两个 "s"。
//"stripe" 缺一个 "s"。
//"stepple" 缺一个 "s"。
//因此,"steps" 是唯一一个包含所有字母的单词,也是本样例的答案。 
//
// 示例 2: 
//
// 输入:licensePlate = "1s3 456", words = ["looks", "pest", "stew", "show"]
//输出:"pest"
//说明:存在 3 个包含字母 "s" 且有着最短长度的补全词,"pest"、"stew"、和 "show" 三者长度相同,但我们返回最先出现的补全词 "pes
//t" 。
// 
//
// 示例 3: 
//
// 输入:licensePlate = "Ah71752", words = ["suggest","letter","of","husband","easy
//","education","drug","prevent","writer","old"]
//输出:"husband"
// 
//
// 示例 4: 
//
// 输入:licensePlate = "OgEu755", words = ["enough","these","play","wide","wonder"
//,"box","arrive","money","tax","thus"]
//输出:"enough"
// 
//
// 示例 5: 
//
// 输入:licensePlate = "iMSlpe4", words = ["claim","consumer","student","camera","
//public","never","wonder","simple","thought","use"]
//输出:"simple"
// 
//
// 
//
// 提示: 
//
// 
// 1 <= licensePlate.length <= 7 
// licensePlate 由数字、大小写字母或空格 ' ' 组成 
// 1 <= words.length <= 1000 
// 1 <= words[i].length <= 15 
// words[i] 由小写英文字母组成 
// 
// Related Topics 哈希表
public String shortestCompletingWord(String licensePlate, String[] words) {
        int[] arr = new int[26];
        int min = Integer.MAX_VALUE;
        boolean flag = true;
        int k = 0;
        for (int i = 0; i < licensePlate.length(); i++) {
            char x = licensePlate.charAt(i);
            if(x >= 'A' && x <= 'Z'){
                arr[x-'A']++;
            }else if(x >= 'a' && x <= 'z'){
                arr[x-'a']++;
            }
        }
        for (int i = 0; i < words.length; i++) {
            int[] nums = new int[26];
            for (int j = 0; j < words[i].length(); j++) {
                nums[words[i].charAt(j)-'a']++;
            }
            for (int j = 0; j < 26; j++) {
                if(arr[j] > nums[j]){
                    flag = false;
                    break;
                }
            }
            if(flag == false){
                flag = true;
            }else{
                if(words[i].length()

 3、宝石与石头

//给定字符串J 代表石头中宝石的类型,和字符串 S代表你拥有的石头。 S 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。 
//
// J 中的字母不重复,J 和 S中的所有字符都是字母。字母区分大小写,因此"a"和"A"是不同类型的石头。 
//
// 示例 1: 
//
// 输入: J = "aA", S = "aAAbbbb"
//输出: 3
// 
//
// 示例 2: 
//
// 输入: J = "z", S = "ZZ"
//输出: 0
// 
//
// 注意: 
//
// 
// S 和 J 最多含有50个字母。 
// J 中的字符不重复。 
// 
// Related Topics 哈希表
public int numJewelsInStones(String jewels, String stones) {
        int[] nums1 = new int[52];
        int[] nums2 = new int[52];
        for (int i = 0; i < jewels.length(); i++) {
            int x = jewels.charAt(i);
            if(x <= 'Z' && x >= 'A'){
                nums1[x-'A']++;
            }else if(x <= 'z' && x >= 'a'){
                nums1[x-'a'+26]++;
            }
        }
        for (int i = 0; i < stones.length(); i++) {
            int x = stones.charAt(i);
            if(x <= 'Z' && x >= 'A'){
                nums2[x-'A']++;
            }else if(x <= 'z' && x >= 'a'){
                nums2[x-'a'+26]++;
            }
        }
        int sum = 0;
        for (int i = 0; i < 52; i++) {
            if(nums1[i]>0){
                sum += nums2[i];
            }
        }
        return sum;
    }

 

你可能感兴趣的:(Leetcode刷题)