题目链接
https://leetcode-cn.com/problems/ransom-note/
源代码 github 地址
https://github.com/YIMEng-0/DataStructure
1、题目要求
https://leetcode-cn.com/problems/ransom-note/
简单理解就是:给定两个字符串,分析能不能使用第二个字符串组成第一个字符串;
2、思路分析
将第二个字符串的每一个字符放置在大小为 26 的数组中,数组保存的是第二个字符串中每一个字符出现的频数;
遍历第一个字符串,找出来第一个字符串中每一个字符,取出来的字符在上面创建的数组中的频次中做减法;
3、执行代码 Java
class Solution {
public boolean canConstruct(String ransomNote, String magazine) {
// 将 magazine 里面的元素分别存储在一个数组中进行维护
// 因为存在 26 个英文字母,所以维护这个数组即可
int[] save = new int[26];
// 将 magazine 的元素进行一一放置进去
for (int i = 0; i < magazine.length();i++) {
int temp = magazine.charAt(i) - 'a';
// 一一进行保存
save[temp] = save[temp] + 1;
}
// 将 ransomNote 里面的每一个字符在上面保存 magazine 里面的数组中减去存在的元素
for(int i = 0; i < ransomNote.length(); i++) {
int temp = ransomNote.charAt(i) - 'a';
if(save[temp] > 0) {
save[temp] = save[temp] - 1;
} else {
return false;
}
}
return true;
}
}
4、问题反思
4.1、理解 save[temp] = save[temp] + 1;
sava[temp] 是数组中保存的元素,相同的字符出现多次的时候,这个用来记录出现的频次;
4.2、理解 if(save[temp] > 0)
当 sava[temp] = 0 的时候,说明使用第二个字符串创建的 sava 数组中没有构成第一个字符串的元素了,这个时候就是返回 false 所以临界条件只能是 sava[temp] > 0;
5、小结
通过使用一个大小为 26 的数组,统计 magazine 里面的每个字符出现的频次;再遍历字符串 ransomNote 在统计字符出现的频次中做减法操作,可以使得比较快速的判断,能否使用第二个字符串来构成第一个字符串;