LeetCode.1160-找到可以由給定字符組成的字符串(Find Words That Can Be Formed by Characters)

這是小川的第411次更新,第443篇原創(chuàng)

看題和準備

今天介紹的是LeetCode算法題中Easy級別的第262題(順位題號是1160)。你會得到一個字符串單詞數(shù)組和一個字符串chars。如果字符串可以由字符中的字符組成(每個字符只能使用一次),則該字符串是好的。返回所有好的字符串的長度之和。

例如:

輸入:words = ["cat","bt","hat","tree"],chars ="atach"
輸出:6
說明:可以形成的字符串是"cat"和"hat",因此答案是3 + 3 = 6。

輸入:words = ["hello","world","leetcode"],chars ="welldonehoneyr"
輸出:10
說明:可以形成的字符串是"hello"和"world",因此答案是5 + 5 = 10。

注意

  • 1 <= words.length <= 1000

  • 1 <= words[i].length , chars.length <= 100

  • 所有字符串僅包含小寫英文字母。

第一種解法

題目的意思是,給了一個由英文小寫字母組成的字符串chars,在字符串數(shù)組words中,如果單詞能夠由chars中的字符組成,那么此單詞就是一個好單詞。

我們直接翻譯題目即可,將chars理解成一個數(shù)組字典,每個字母出現(xiàn)的次數(shù)計數(shù),變成一個26位長度的int數(shù)組,接著去遍歷words中的單詞,采用同樣的原理,將單詞每個字母當做字典數(shù)組的索引,出現(xiàn)一次就減1,如果字典數(shù)組中的元素值小于0,說明當前單詞無法由chars中的字母組成,結束本此循環(huán),直到遍歷完所有單詞。

public int countCharacters(String[] words, String chars) {
    // 獲取字典數(shù)組
    int[] dict = stringToIntegerArray(chars);
    int sum = 0;
    for (int i=0, len=words.length; i<len; i++) {
        // 復制一份字典數(shù)組,為后面的減法做準備
        int[] temp = dict.clone();
        int len2 = words[i].length();
        // 默認當前單詞是好字符串
        boolean flag = true;
        for (int j=0; j<len2; j++) {
            // 單詞中的字母不在字典中,或超過使用次數(shù)
            if (--temp[words[i].charAt(j)-'a'] < 0) {
                flag = false;
                break;
            }
        }
        if (flag) {
            sum += words[i].length();
        }
    }
    return sum;
}

/**
 * 將字符串轉為長度為26的int數(shù)組
 * @param s 字符串
 * @return 長度為26的int數(shù)組
 */
public int[] stringToIntegerArray(String s) {
    int[] arr = new int[26];
    for (int i=0, len=s.length(); i<len; i++) {
        arr[s.charAt(i)-'a']++;
    }
    return arr;
}


第二種解法

和第一種解法的思路類似,只是將第一種解法的數(shù)組復制替換成了另外一種寫法,將當前單詞也轉為一個長度為26的int數(shù)組,然后比較字典數(shù)組和單詞數(shù)組元素值的大小,如果單詞數(shù)組當前元素值大于字典數(shù)組當前元素值,則表示單詞中的某些字母不在字典中或者出現(xiàn)次數(shù)超過了字典中的次數(shù)。

public int countCharacters2(String[] words, String chars) {
    // 獲取字典數(shù)組
    int[] dict = stringToIntegerArray(chars);
    int sum = 0, len = words.length, len2 = dict.length;
    for (int i=0; i<len; i++) {
        // 將單詞也轉為int數(shù)組
        int[] temp = stringToIntegerArray(words[i]);
        boolean flag = true;
        for (int j=0; j<len2; j++) {
            if (temp[j] > dict[j]) {
                flag = false;
                break;
            }
        }
        if (flag) {
            sum += words[i].length();
        }
    }
    return sum;
}

/**
 * 將字符串轉為長度為26的int數(shù)組
 * @param s 字符串
 * @return 長度為26的int數(shù)組
 */
public int[] stringToIntegerArray(String s) {
    int[] arr = new int[26];
    for (int i=0, len=s.length(); i<len; i++) {
        arr[s.charAt(i)-'a']++;
    }
    return arr;
}


小結

算法專題目前已更新LeetCode算法題文章268+篇,公眾號對話框回復【數(shù)據(jù)結構與算法】、【算法】、【數(shù)據(jù)結構】中的任一關鍵詞,獲取系列文章合集。

以上就是全部內(nèi)容,如果大家有什么好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發(fā)就是對我最大的回報和支持!

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容