LeetCode771-寶石與石頭
阿新 • • 發佈:2020-11-24
非商業,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