1. 程式人生 > 實用技巧 >LeetCode771-寶石與石頭

LeetCode771-寶石與石頭

非商業,LeetCode連結附上:

https://leetcode-cn.com/problems/jewels-and-stones/

進入正題。

題目:

給定字串J代表石頭中寶石的型別,和字串S代表你擁有的石頭。S中每個字元代表了一種你擁有的石頭的型別,你想知道你擁有的石頭中有多少是寶石。

J中的字母不重複,J和S中的所有字元都是字母。字母區分大小寫,因此"a"和"A"是不同型別的石頭。

示例:

示例 1:

輸入: J = "aA", S = "aAAbbbb"
輸出: 3

示例 2:

輸入: J = "z", S = "ZZ"
輸出: 0

注意:

S和J最多含有50個字母。

J中的字元不重複。

程式碼實現:

    //暴力法
    public int numJewelsInStones(String J, String S) {

        int jewelsCount = 0;
        int jewelsLength = J.length(), stonesLength = S.length();

        for (int i = 0; i < jewelsLength; i++) {
            char jewel = J.charAt(i);
            for (int j = 0; j < stonesLength; j++) {
                char stone = S.charAt(j);
                if(jewel == stone) {
                    jewelsCount++;
                }
            }
        }
        return jewelsCount;
    }
    //時間複雜度O(mn),空間複雜度O(1)

    //雜湊集合
    public int numJewelsInStones(String J, String S) {

        int jewelsCount = 0;
        Set<Character> jewelsSet = new HashSet<>();
        int jewelsLength = J.length(), stonesLength = S.length();

        for (int i = 0; i < jewelsLength; i++) {
            char jewel = J.charAt(i);
            jewelsSet.add(jewel);
        }

        for (int i = 0; i < stonesLength; i++) {
            char stone = S.charAt(i);
            if(jewelsSet.contains(stone)) {
                jewelsCount++;
            }
        }

        return jewelsCount;
    }    
    //時間複雜度O(m + n),其中m是字串J度長度,n是字串S的長度
    //空間複雜度O(m)

分析:

之所以把這道題單獨拎出來,是在寫的時候感覺到了暴力方法的暴力美學,不摻雜多餘的技巧,也不需要太多的解釋。

有一點要注意的是chatAt()方法的使用,之前偶爾會將字串轉化成字元陣列,這樣就在無形中增加了空間複雜度。

暴力方法基本都不會是最終最優的解法,在解演算法題或人生中也都逐漸的遠離暴力的解決問題的方式吧。

--End