# 突破编程_C++_字符串算法（判断字符串是否包含）

10 篇文章 1 订阅

## 1 算法题 ：判断一个字符串是否包含另一个字符串的所有字符（不一定连续）

### 1.2 示例

• 主字符串: “abcdefghijklmnopqrstuvwxyz”
• 子字符串: “abcde”

• 主字符串: “mississippi”
• 子字符串: “missip”

• 主字符串: “abcdefg”
• 子字符串: “defghijklmnop”

（1）初始化哈希表：

（2）遍历主字符串并更新哈希表：

（3）检查哈希表：

（4）返回结果：

## 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]++;
}

// 遍历主字符串并更新哈希表
for (char c : mainString) {
if (charCounts.find(c) != charCounts.end()) {
charCounts[c]--;
if (charCounts[c] == 0) {
// 如果字符的计数减到0，从哈希表中删除该字符
charCounts.erase(c);
}
}
}

// 检查哈希表
return charCounts.empty(); // 如果哈希表为空，说明所有字符都被找到了
}
};


int main()
{
Solution solution;

std::string mainString = "abcdefghijklmnopqrstuvwxyz";
std::string subString = "abcde";
std::cout << "Does \"" << mainString << "\" contain all characters of \"" << subString << "\"? "
<< (solution.isContainsAllCharacters(mainString, subString) ? "Yes" : "No") << std::endl;

mainString = "mississippi";
subString = "missip";
std::cout << "Does \"" << mainString << "\" contain all characters of \"" << subString << "\"? "
<< (solution.isContainsAllCharacters(mainString, subString) ? "Yes" : "No") << std::endl;

mainString = "abcdefg";
subString = "defghijklmnop";
std::cout << "Does \"" << mainString << "\" contain all characters of \"" << subString << "\"? "
<< (solution.isContainsAllCharacters(mainString, subString) ? "Yes" : "No") << std::endl;

return 0;
}


Does "abcdefghijklmnopqrstuvwxyz" contain all characters of "abcde"? Yes
Does "mississippi" contain all characters of "missip"? Yes
Does "abcdefg" contain all characters of "defghijklmnop"? No


### 3.2 使用排序和比较的方法

#include <iostream>
#include <cctype>
#include <string>
#include <algorithm> // 用于std::sort

class Solution
{
public:
bool isContainsAllCharacters(const std::string& mainString, const std::string& subString) {
// 对两个字符串进行排序
std::string sorted_main = mainString;
std::string sorted_sub = subString;
std::sort(sorted_main.begin(), sorted_main.end());
std::sort(sorted_sub.begin(), sorted_sub.end());

// 使用双指针法检查 sorted_sub 是否是 sorted_main 的子序列
int i = 0, j = 0;
while (i < sorted_sub.length() && j < sorted_main.length()) {
if (sorted_sub[i] == sorted_main[j]) {
i++; // 移动到 sorted_sub 的下一个字符
}
j++; // 移动到 sorted_main 的下一个字符
}

// 如果 sorted_sub 的所有字符都在 sorted_main 中找到，则 sorted_sub 是 sorted_main 的子序列
return  sorted_sub.length() == i;
}
};


## 4 测试用例

（1）基础测试用例：

• 主字符串: “abcdefg”
• 子字符串: “bcd”

（2）包含所有字符但顺序不同：

• 主字符串: “bacdefg”
• 子字符串: “abc”

（3）缺少一个字符：

• 主字符串: “abdefg”
• 子字符串: “abc”

（4）包含重复字符：

• 主字符串: “aabbbccc”
• 子字符串: “abc”

（5）子字符串是主字符串的前缀：

• 主字符串: “abcdefg”
• 子字符串: “abc”

• 27
点赞
• 24
收藏
觉得还不错? 一键收藏
• 0
评论

### “相关推荐”对你有帮助么？

• 非常没帮助
• 没帮助
• 一般
• 有帮助
• 非常有帮助

1.余额是钱包充值的虚拟货币，按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载，可以购买VIP、付费专栏及课程。