383. 赎金信
给你两个字符串:ransomNote
和 magazine
,判断 ransomNote
能不能由 magazine
里面的字符构成。
如果可以,返回 true
;否则返回 false
。
magazine
中的每个字符只能在 ransomNote
中使用一次。
示例 1:
输入:ransomNote = "a", magazine = "b"
输出:false
示例 2:
输入:ransomNote = "aa", magazine = "ab"
输出:false
示例 3:
输入:ransomNote = "aa", magazine = "aab"
输出:true
提示:
1 <= ransomNote.length, magazine.length <= 105
ransomNote
和magazine
由小写英文字母组成
题解:
class Solution {
public boolean canConstruct(String ransomNote, String magazine) {
//当magzine的长度小于ransonNote 不符合
if(magazine.length()<ransomNote.length()) return false;
//分别储存26个字母出现的次数
int[] count=new int[26];
// 先遍历magazine,统计每个字母出现的次数
for(int c:magazine.toCharArray()){
count[c-'a']++;
}
// 再遍历ransomNote,减去每个字母出现的次数,如果有字母次数小于0,则不满足
for(int c:ransomNote.toCharArray()){
// 假如ransomNote 中a出现2次,magazine中的a出现1次,此时 count[]值是负数,说明不满足
count[c-'a']--;
if(count[c-'a']<0){
return false;
}
}
return true;
}
}
考验字符串的遍历,char字符的减法的理解,底层是考验了char和字符串的关系。假如是多年不撸码,或者从来撸码不涉及这部分领域的还需要脑子多想想。
依旧又需要数组的知识。遍历字符串magazine,把字母的计数记录到arr
遍历ransomNote,把字母和arr的比对,如果没有则直接判定题目为false
如果有,把对应的字母减1,代表消耗了一次。
多谢一招:
数组遍历的三种方式:
public class ArrayLambda {
public static void main(String[] args) {
Integer[] items = {1, 2, 3};
// 普通for循环遍历
System.out.println("第一种方式:普通for循环遍历 Array 数组");
for (int i = 0; i < items.length; i++) {
System.out.println(items[i]);
}
// 增强for循环遍历
System.out.println("\n第二种方式:增强for循环遍历 Array 数组");
for (Integer item : items) {
System.out.println(item);
}
// Lambda 表达式遍历(JDK 1.8)
System.out.println("\n第三种方式:Lambda 表达式遍历 Array 数组");
Arrays.asList(items).forEach(item -> System.out.println(item));
}
}