一【题目类别】
- 哈希表
二【题目难度】
- 简单
三【题目编号】
- 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
六【解题思路】
- 利用哈希表的思想
- 首先计算待匹配字符串每个元素的出现次数
- 然后再扫描匹配的字符串,没出现一次某个字符,就将其出现次数减一
- 最后扫描哈希表,出现次数超过0的就是没有成功匹配,返回false即可
- 如果成功匹配返回true即可
七【题目提示】
- 1 < = r a n s o m N o t e . l e n g t h , m a g a z i n e . l e n g t h < = 1 0 5 1 <= ransomNote.length, magazine.length <= 10^5 1<=ransomNote.length,magazine.length<=105
- r a n s o m N o t e 和 m a g a z i n e 由小写英文字母组成 ransomNote 和 magazine 由小写英文字母组成 ransomNote和magazine由小写英文字母组成
八【时间频度】
- 时间复杂度: O m a x ( m , n ) Omax(m,n) Omax(m,n),其中 m , n m,n m,n 是字符串长度
- 空间复杂度: O ( 1 ) O(1) O(1)
九【代码实现】
- Java语言版
package HashTable;
public class p383_RansomNote {
public static void main(String[] args) {
String ransomNote = "a";
String magazine = "b";
boolean res = canConstruct(ransomNote, magazine);
System.out.println("res = " + res);
}
public static boolean canConstruct(String ransomNote, String magazine) {
int lenA = ransomNote.length();
int lenB = magazine.length();
int[] map = new int[26];
for (int i = 0; i < lenA; i++) {
char temp = ransomNote.charAt(i);
map[temp - 'a']++;
}
for (int i = 0; i < lenB; i++) {
char temp = magazine.charAt(i);
map[temp - 'a']--;
}
for (int i = 0; i < 26; i++) {
if (map[i] > 0) {
return false;
}
}
return true;
}
}
- C语言版
#include<stdio.h>
#include<stdbool.h>
bool canConstruct(char * ransomNote, char * magazine)
{
int lenA = strlen(ransomNote);
int lenB = strlen(magazine);
int map[26] = { 0 };
for (int i = 0; i < lenA; i++)
{
map[ransomNote[i] - 'a']++;
}
for (int i = 0; i < lenB; i++)
{
map[magazine[i] - 'a']--;
}
for (int i = 0; i < 26; i++)
{
if (map[i] > 0)
{
return false;
}
}
return true;
}
/*主函数省略*/
十【提交结果】
-
Java语言版
-
C语言版