【C++算法】57.哈希表_判断是否互为字符重排
文章目录
- 题目链接:
- 题目描述:
- 解法
- C++ 算法代码:
题目链接:
面试题 01.02. 判定是否互为字符重排
题目描述:
解法
解法一:暴力解法
找出字符串的全排序,然后比较是否相同(指数级别的,太恐怖了)
解法二:哈希表
统计每个字符出现的次数。次数相同就是字符重排。
这里是用数组模拟哈希表,用容器的话会麻烦一点。
C++ 算法代码:
class Solution
{
public:
bool CheckPermutation(string s1, string s2)
{
// 首先检查两个字符串长度是否相等
// 如果长度不同,它们不可能互为重排列
if(s1.size() != s2.size()) return false;
// 创建一个大小为26的整型数组作为哈希表
// 用于统计小写字母a-z出现的次数
int hash[26] = { 0 };
// 第一步:遍历第一个字符串,统计每个字符出现的次数
for(auto ch : s1)
hash[ch - 'a']++; // 将字符转换为0-25的索引并增加计数
// 第二步:遍历第二个字符串,减少对应字符的计数
for(auto ch : s2)
{
hash[ch - 'a']--; // 将字符转换为0-25的索引并减少计数
// 如果任何字符的计数变为负数,说明s2中某个字符出现次数超过了s1
// 这意味着两个字符串不可能互为重排列
if(hash[ch - 'a'] < 0) return false;
}
// 如果所有检查都通过,表示两个字符串互为重排列
return true;
}
};