力扣 242. 有效的字母异位词

题目说明

给定一个赎金信 (ransom) 字符串和一个杂志(magazine)字符串,判断第一个字符串 ransom 能不能由第二个字符串 magazines 里面的字符构成。如果可以构成,返回 true ;否则返回 false。

(题目说明:为了不暴露赎金信字迹,要从杂志上搜索各个需要的字母,组成单词来表达意思。杂志字符串中的每个字符只能在赎金信字符串中使用一次。)

  • 提示:
    • 你可以假设两个字符串均只含有小写字母。

示例

示例 1:

1
2
输入:ransomNote = "a", magazine = "b"
输出:false

示例 2:

1
2
输入:ransomNote = "aa", magazine = "ab"
输出:false

示例 3:

1
2
输入:ransomNote = "aa", magazine = "aab"
输出:true

笔者理解

此题是一道字符串算法问题,在力扣题库中被定义为简单题。

解法

当笔者阅读完此题后,直接统计出现各字母频次来进行判定,让我们来看看具体如何实现的吧。

实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Solution {
/*
* 字符串
*/
public boolean canConstruct(String ransomNote, String magazine) {
// 因为两个字符串均只含有小写字母,所以可以用数组记录各字母出现次数
int[] letters = new int [26];

// 统计杂志中各字母出现的频次
for (int i = 0; i < magazine.length(); i++) {
letters[magazine.charAt(i) - 'a']++;
}

// 判断赎金信中的字符是否被包含
for (int i = 0; i < ransomNote.length(); i++) {
int ch = ransomNote.charAt(i) - 'a';
if (letters[ch] < 1) {
return false;
}
letters[ch]--;
}

return true;
}
}

时间和空间效率还行,可见此解法还比较适合此题。

image-20210905214301159

总结

本题是今天的一题,难度是为简单,感兴趣的朋友都可以去尝试一下,此题还有其他更多的解法,朋友们可以自己逐一尝试。