1.题目
给你两个字符串:ransomNote
和 magazine
,判断 ransomNote
能不能由 magazine
里面的字符构成。
如果可以,返回 true
;否则返回 false
。
magazine
中的每个字符只能在 ransomNote
中使用一次。
2.示例
3.思路
统计字符:
首先观察字符串很明显,如果ransomNote的长度大于magazine的时候则一定返回false。然后由于字符串都是由小写字母组成。那么可以创建两个int型数组,用来记录两个字符串英文字母出现的次数。最后只需要比较两个数组的值,只要ransomNote中的统计数不会大于magazine的字母统计数。
4.代码
LeetCode代码:
class Solution {
public boolean canConstruct(String ransomNote, String magazine) {
if (ransomNote.length()>magazine.length()){
return false;
}
int ransomNotes[] = new int[26];
int magazines[] = new int[26];
for (int i:ransomNote.toCharArray()) {
ransomNotes[i-'a']++;
}
for (int j:magazine.toCharArray()) {
magazines[j-'a']++;
}
for (int i=0;i<26;i++){
if (ransomNotes[i]>magazines[i]){
return false;
}
}
return true;
}
}
案例详细代码:
package Example12_1;
public class javaDemo {
public static void main(String[] args) {
String ransomNote ="aa";
String magazine ="ab";
boolean flag = true;
// 判断特殊情况
if (ransomNote.length()>magazine.length()){
flag = false;
}
// 创建统计字母的整数型数组
int ransomNotes[] = new int[26];
int magazines[] = new int[26];
// 分别进行统计字母与个数,注意这里虽然用toCharArray创建了匿名字符数组
// 匿名字符数组在执行完毕功能后后会自动被系统垃圾回收,达到减少空间的目的
for (int i:ransomNote.toCharArray()) {
ransomNotes[i-'a']++;
}
for (int j:magazine.toCharArray()) {
magazines[j-'a']++;
}
// 两者数组之间的比较,如果出现ransomNotes的元素要大于magazines的则返回false
for (int i=0;i<26;i++){
if (ransomNotes[i]>magazines[i]){
flag = false;
break;
}
}
System.out.println(flag);
}
}