标题 | 383. 赎金信 |
难度 | 简单 |
天数 | 第6天,第2/3题 |
数据结构 | 字符串 |
给你两个字符串:
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
由小写英文字母组成
以上内容来源:力扣(LeetCode)
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
- 如果ransomNote长度 > magazine长度,那么不符合规则直接返回
//ransomNote长度
int m = ransomNote.length();
//magazine长度
int n = magazine.length();
if(m > n){
return false;
}
- 创建一个长度是26的数组,计算magazine所有字符数量
for(int i = 0 ; i < n ; i++){
//magazine 提供字符数量计数
int item = magazine.charAt(i) - 'a';
dp[item]++;
}
- 然后遍历ransomNote 查找字符,字符数量-1,如果
<0
,代表不符合规则,返回false
//遍历 ransomNote 查找字符串
for(int i = 0 ; i < m;i++){
int item = ransomNote.charAt(i) - 'a';
dp[item]--;
//小于0 代表 magazine 改字符数量不够,返回false
if(dp[item] < 0){
return false;
}
}
完整代码
class Solution {
//数据结构 第 6 天 2/3 字符串
public boolean canConstruct(String ransomNote, String magazine) {
//ransomNote长度
int m = ransomNote.length();
//magazine长度
int n = magazine.length();
int[] dp = new int[26];
if(m > n){
return false;
}
for(int i = 0 ; i < n ; i++){
//magazine 提供字符数量计数
int item = magazine.charAt(i) - 'a';
dp[item]++;
}
//遍历 ransomNote 查找字符串
for(int i = 0 ; i < m;i++){
int item = ransomNote.charAt(i) - 'a';
dp[item]--;
//小于0 代表 magazine 改字符数量不够,返回false
if(dp[item] < 0){
return false;
}
}
return true;
}
}