博主這半年來一直在主要學習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。