LeetCode周賽——拼寫單詞

博主這半年來一直在主要學習Java的有關知識,疏忽了對算法的訓練,偶得一著名刷題網站LeetCode,出於對算法的熱愛,便決定開始刷題一段時間,加上前幾天給我推送了周賽的消息,便報了名。爲了鞏固Java的知識,便選擇了用Java語言來coding。
雖然開始前的緊張中帶着幾分的憧憬,但是打開第一題便目瞪口呆,有題雲:
給你一份『詞彙表』(字符串數組) words 和一張『字母表』(字符串) chars。
假如你可以用 chars 中的『字母』(字符)拼寫出 words 中的某個『單詞』(字符串),那麼我們就認爲你掌握了這個單詞。
注意:每次拼寫時,chars 中的每個字母都只能用一次。
返回詞彙表 words 中你掌握的所有單詞的長度之和。
示例1:

輸入:words = ["cat","bt","hat","tree"], chars = "atach"
輸出:6
解釋: 
可以形成字符串 "cat" 和 "hat",所以答案是 3 + 3 = 6。

示例2:

輸入:words = ["hello","world","leetcode"], chars = "welldonehoneyr"
輸出:10
解釋:
可以形成字符串 "hello" 和 "world",所以答案是 5 + 5 = 10。

提示:
1.1 <= words.length <= 1000
2.1 <= words[i].length, chars.length <= 100
3.所有字符串中都僅包含小寫英文字母
我嘗試了很多種方法,因爲對Java的API並沒有做到非常熟悉,所以很多方法都不會用,寫出的代碼甚至連編譯都過不了,便在結束之後,看了排名第一的大佬的代碼,嘆爲妙絕,因爲大佬寫的是C++代碼,便在理解之後,改爲了Java代碼
代碼如下

class Solution {
    public int countCharacters(String[] words, String chars) {
    	// 統計字母表的字母出現次數
        int[] chars_count = count(chars);
        int res = 0;
        for (String word : words) {
        	// 統計單詞的字母出現次數
            int[] word_count = count(word);
            if (contains(chars_count, word_count)) {
                res += word.length();
            }
        }
        return res;
    }

    // 檢查字母表的字母出現次數是否覆蓋單詞的字母出現次數
    boolean contains(int[] chars_count, int[] word_count) {
        for (int i = 0; i < 26; i++) {
            if (chars_count[i] < word_count[i]) {
                return false;
            }
        }
        return true;
    }

    // 統計 26 個字母出現的次數
    int[] count(String word) {
        int[] counter = new int[26];
        for (int i = 0; i < word.length(); i++) {
            char c = word.charAt(i);
            counter[c-'a']++;
        }
        return counter;
    }
}

這個題的思路在處理字符串問題中很常見,開兩個26個int長度的一維數組,每個元素存儲對應字母的數量,s數組存儲的是字母表字母的數量,t數組存儲詞彙表每個詞彙的字母數量,在用一次for循環來判斷兩張表對應字母的數量,只有當每一個字母在詞彙表中出現的次數小於字母表時,才能夠將詞彙的長度加到ans中,等到最外層for循環結束,返回ans。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章