go語言題解LeetCode1160拼寫單詞示例詳解
題目描述
給你一份『詞匯表』(字符串數組) 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 <= words.length <= 1000
1 <= words[i].length, chars.length <= 100
所有字符串中都僅包含小寫英文字母
思路分析
先統(tǒng)計chars中各字母(字符)的個數
然后分別統(tǒng)計words字符串數組中的每個字符串的各個字母(字符)的個數
然后在26個對應位置作比較
若當前word字符串的對應位置字符數小于等于chars中對應位置字符數
則記錄當前word字符串的長度
將其做為總長度的一部分
依次比較余下的word字符串,重復前面操作,最終得到總長度(答案)
AC 代碼
class Solution {
public int countCharacters(String[] words, String chars) {
int n=chars.length();
int[] arr=new int[26];
for(int i=0;i<n;i++){
arr[chars.charAt(i)-'a']++;
}
int res=0;
for(String word:words){
int[] arr1=new int[26];
for(int j=0;j<word.length();j++){
arr1[word.charAt(j)-'a']++;
}
for(int i=0;i<26;i++){
if(arr1[i]<=arr[i]) {
if(i==25) res=res+word.length();
}else break;
}
}
return res;
}
}
參考
別人用int[26] 解題思路
友情提示:遇到有提示字符串僅包含小寫(或者大寫)英文字母的題,
都可以試著考慮能不能構造長度為26的每個元素分別代表一個字母的數組,來簡化計算
對于這道題,用數組c來保存字母表里每個字母出現(xiàn)的次數
如法炮制,再對詞匯表中的每個詞匯都做一數組w,比較數組w與數組c的對應位置
如果w中的都不大于c,就說明該詞可以被拼寫出,長度計入結果
如果w其中有一個超過了c,則說明不可以被拼寫,直接跳至下一個(這里用到了帶label的continue語法)
代碼
class Solution {
public int countCharacters(String[] words, String chars) {
int[] c = new int[26];
for(char cc : chars.toCharArray()) {
c[(int)(cc - 'a')] += 1;
}
int res = 0;
a: for(String word : words) {
int[] w = new int[26];
for(char ww : word.toCharArray()) {
w[(int)(ww - 'a')] += 1;
}
for(int i=0; i<26; i++) {
if(w[i] > c[i]) {
continue a;
}
}
res += word.length();
}
return res;
}
}
c++幾乎雙百的哈希解法

解題思路
1 構建chars的字符到數量映射表
2. 對于words里的每個單詞也構建類似一個表,構建后去遍歷比較是否小于等于chars里的數量,否則失敗
代碼
class Solution {
public:
int countCharacters(vector<string>& words, string chars) {
// 記錄累計的長度之和
int res = 0;
// 構建chars的映射表
int cnt[26];
memset(cnt, 0, sizeof(int)*26);
for (char c : chars)
{
++cnt[c-'a'];
}
??????? // 遍歷words去構建每個映射表,然后比較即可
int curr[26];
for (string word : words)
{
memset(curr, 0, sizeof(int)*26);
for (char c : word)
{
++curr[c-'a'];
}
bool IsOK= true;
for (int i = 0; i < 26; ++i)
{
if (curr[i] > cnt[i])
{
IsOK = false;
break;
}
}
if (IsOK)
{
res += word.size();
}
}
return res;
}
};
以上就是go語言題解LeetCode1160拼寫單詞示例詳解的詳細內容,更多關于go題解拼寫單詞的資料請關注腳本之家其它相關文章!
相關文章
go高并發(fā)時append方法偶現(xiàn)錯誤解決分析
這篇文章主要為大家介紹了go高并發(fā)時append方法偶現(xiàn)錯誤解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-10-10
通過Golang實現(xiàn)linux命令ls命令(命令行工具構建)
這篇文章主要為大家詳細介紹了如何通過Golang實現(xiàn)一個linux命令ls命令(命令行工具構建),文中的示例代碼講解詳細,具有一定的學習價值,感興趣的可以了解一下2023-01-01
Go 循環(huán)結構for循環(huán)使用教程全面講解
這篇文章主要為大家介紹了Go 循環(huán)結構for循環(huán)使用全面講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-10-10
Golang實現(xiàn)Directional Channel(定向通道)
這篇文章主要介紹了Golang實現(xiàn)Directional Channel(定向通道),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-02-02

