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 并不考虑顺序,只考虑个数。
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'] ++
其实操作的过程是:
- 因为数组一共有26位,其实每一位代表的是一个lowercase letter。
-
c-'a'
的目的是节省空间,ACSII码字符对照表中,a~z = 97~122。 - 然后
++
操作,就是计数,累计。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]
。也就是说这个数组里index=1的位置上的value表示的是“b字母的个数”,一开始是0,现在++
后是1了。 - 然后看到第二个b,其实就是
charAt(1)
,然后这个值也是‘b’-'a' = 98-97 = 1,arr[1]
。我们要再一次更改arr[1]
的值了,现在是2了。 - 接下来是第一个c,其实就是
charAt(2)
,但是这个值计算为'c'-'a' = 99 -97 = 2,'arr[2]'。我们现在要对arr[2]的数字进行累加。 - 之后的以此类推。
对于ransomNote的字符数组来说,看到一个要 --arr[index]
一个,作累减操作。当发现ransom里的字母比magazine里多的时候,返回false。比如("aa","a")这个情况,第一个for loop结束时, arr[0] = 1
,但我们ransomNote里将要作两次“--”操作。
Notes:
字符数组
toCharArray() 将字符串--->字符数组
valueOf() 将char类型的数组--->字符串
字符串常亮数组,初始化:
char c[] = {"abc"};
char c[] = "abc";````