1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| class Solution { public boolean canConstruct(String ransomNote, String magazine) { int[] one = new int[26]; for (int i = 0; i < ransomNote.length(); i++) { int idx = ransomNote.charAt(i) - 'a'; one[idx] += 1; } for (int i = 0; i < magazine.length(); i++) { int idx = magazine.charAt(i) - 'a'; if (one[idx] != 0) { one[idx] -= 1; } } for (int num : one) { if (num > 0) { return false; } } return true; } }
|
思路很简单, 用一个长度为26的数组记录ransomNote里的各个字母出现的次数, 然后再遍历magazine看看是否能够抵消完. 当然如果有的字母多出来也没问题.
时间复杂度: O(n + m)
空间复杂度: O(1)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| class Solution { public boolean canConstruct(String ransomNote, String magazine) { int[] one = new int[26]; for (int i = 0; i < magazine.length(); i++) { int idx = magazine.charAt(i) - 'a'; one[idx] += 1; } for (int i = 0; i < ransomNote.length(); i++) { int idx = ransomNote.charAt(i) - 'a'; if (one[idx] == 0) { return false; } else { one[idx] -= 1; } } return true; } }
|
这种解法是我没想到的. 我的是存ransomNote的频率, 它则是先存magazine的频率. 这样的话我们在之后遍历ransomNote的时候就可以顺带检查是否有足够的字母去使用. 这样减少了一个for循环, 相当nice.
时间复杂度和空间复杂度都没有改变.