1 算法题 :判断一个字符串是否包含另一个字符串的所有字符(不一定连续)
1.1 题目含义
判断一个字符串(称为“主字符串”或“大字符串”)是否包含另一个字符串(称为“子字符串”或“小字符串”)的所有字符,且不论这些字符在主字符串中的顺序和连续性。换句话说,我们要确认子字符串的每一个字符至少在主字符串中出现一次。
1.2 示例
示例 1:
输入:
- 主字符串: “abcdefghijklmnopqrstuvwxyz”
- 子字符串: “abcde”
输出: true
解释: 主字符串包含子字符串的所有字符。
示例 2:
输入:
- 主字符串: “mississippi”
- 子字符串: “missip”
输出: true
解释: 尽管 “missip” 在主字符串中不是连续的,但主字符串包含子字符串的所有字符。
示例 3:
输入:
- 主字符串: “abcdefg”
- 子字符串: “defghijklmnop”
输出: false
解释: 主字符串不包含子字符串的所有字符,因为 “hijklmnop” 中的字符在主字符串中没有出现。
2 解题思路
解题思路如下:
(1)初始化哈希表:
在 C++ 中,我们可以使用std::unordered_map来作为哈希表。首先,遍历子字符串,对于每个字符,我们在unordered_map中增加其计数。
(2)遍历主字符串并更新哈希表:
然后,遍历主字符串。对于主字符串中的每个字符,我们检查它是否在unordered_map中。如果在,则将其对应的计数减一。如果不在,说明主字符串中缺少该字符,因此可以立即返回false。
(3)检查哈希表:
在遍历完主字符串后,我们检查 unordered_map 中所有字符的计数是否都已经归零。如果所有计数都为零,说明主字符串包含了子字符串的所有字符,返回 true;如果存在任何非零计数,说明主字符串缺少某些字符,返回 false。
(4)返回结果:
根据unordered_map的状态,返回相应的布尔值。
3 算法实现代码
3.1 使用哈希表
如下为算法实现代码:
#include <iostream>
#include <unordered_map>
#include <string>
class Solution
{
public:
bool isContainsAllCharacters(const std::string& mainString, const std::string& subString) {
// 初始化哈希表
std::unordered_map<char, int> charCounts;
for (char c : subString) {
charCounts[c]++;
}
// 遍历主字符串并更新哈希表