Q:
Given an arbitrary ransom note string and another string containing letters from all the magazines, write a function that will return true if the ransom note can be constructed from the magazines ; otherwise, it will return false. Each letter in the magazine string can only be used once in your ransom note.
Note:You may assume that both strings contain only lowercase letters.
canConstruct("a", "b") -> false
canConstruct("aa", "ab") -> false
canConstruct("aa", "aab") -> true
A:
canConstruct("cab", "bca") -> true 并不考慮順序业岁,只考慮個數(shù)搓茬。
public class Solution {
public boolean canConstruct(String ransomNote, String magazine) {
int[] arr = new int[26];
for (char c : magazine.toCharArray()) arr[c - 'a']++;
for (char c : ransomNote.toCharArray())
if (--arr[c - 'a'] < 0) return false;
return true;
}
}
arr[c - 'a'] ++
其實操作的過程是:
- 因為數(shù)組一共有26位蝌箍,其實每一位代表的是一個lowercase letter族吻。
-
c-'a'
的目的是節(jié)省空間,ACSII碼字符對照表中姐浮,a~z = 97~122谷遂。 - 然后
++
操作,就是計數(shù)卖鲤,累計肾扰。arr[index]++;
=arr[index] = arr[index]+1;
toCharArray() 省去了for loop遍歷:
for (int i = 0; i < magazine.length(); i++) { arr[magazine.charAt(i) - 'a']++; }
比如“bbcab”這個字符串:
- 我們看到第一個b,其實就是
charAt(0)
蛋逾,然后這個值就是‘b’-'a' = 98-97 = 1白对,arr[1]
。也就是說這個數(shù)組里index=1的位置上的value表示的是“b字母的個數(shù)”换怖,一開始是0甩恼,現(xiàn)在++
后是1了。 - 然后看到第二個b,其實就是
charAt(1)
条摸,然后這個值也是‘b’-'a' = 98-97 = 1悦污,arr[1]
。我們要再一次更改arr[1]
的值了钉蒲,現(xiàn)在是2了切端。 - 接下來是第一個c,其實就是
charAt(2)
顷啼,但是這個值計算為'c'-'a' = 99 -97 = 2踏枣,'arr[2]'。我們現(xiàn)在要對arr[2]的數(shù)字進(jìn)行累加钙蒙。 - 之后的以此類推茵瀑。
對于ransomNote的字符數(shù)組來說,看到一個要 --arr[index]
一個躬厌,作累減操作马昨。當(dāng)發(fā)現(xiàn)ransom里的字母比magazine里多的時候,返回false扛施。比如("aa","a")這個情況鸿捧,第一個for loop結(jié)束時, arr[0] = 1
,但我們ransomNote里將要作兩次“--”操作疙渣。
Notes:
字符數(shù)組
toCharArray() 將字符串--->字符數(shù)組
valueOf() 將char類型的數(shù)組--->字符串
字符串常亮數(shù)組匙奴,初始化:
char c[] = {"abc"};
char c[] = "abc";````