【九章斩题录】Leetcode:判定是否互为字符重排(C/C++)


面试题 01.02. 判定是否互为字符重排

**✅ 模板:**C++

cpp 复制代码
class Solution {
public:
    bool CheckPermutation(string s1, string s2) {

    }
};

「 法一 」排序

**💡 思路:**看到题目中说 "重新排列后能否变成另一个字符串",等等......重新排列?

我勒个豆,这题直接 sort 两下不就秒了?

排序完比对一下两个字符串是不是一样的就行了:

cpp 复制代码
class Solution {
public:
    bool CheckPermutation(string s1, string s2) {
        sort(s1.begin(), s1.end());   // 排s1
        sort(s2.begin(), s2.end());   // 排s2 

        return s1 == s2 ? true : false;   // 对比
    }
};

写完了,然后想了想应该可以再优化一下,如果长度不相等那必然不能重排。

而且好像也没必要用三目,直接 return 表达式就行。

cpp 复制代码
class Solution {
public:
    bool CheckPermutation(string s1, string s2) {
        if (s1.size() != s2.size()) {   // 检查一下
            return false;
        }
        sort(s1.begin(), s1.end());  
        sort(s2.begin(), s2.end());

        return s1 == s2;   // 脑抽用三目,忘了可以直接返回了。
    }
};

哈哈哈搞定了,sort 排序时间复杂度为 ,比较用了 ,所以时间复杂度为:

用 sort 轻松将该题斩于马下......


「 法二 」HashMap!uh~

**💡 思路:**好像也可以用哈希,HHHHHHHHHash Map!ur!

分别 for 滚一轮 s1 和 s2 的元素:

  • 统计字符串 s1 各字符数量,遇到 +1
  • 统计字符串 s2 各字符数量,遇到 -1
  • 遍历 s1, s2 中各字符的数量差,若 s1, s2 中某字符的数量不一致,则不互为重排。

如果都对上了,就是 "抵消" 了,看代码:

cpp 复制代码
class Solution {
public:
    bool CheckPermutation(string s1, string s2) {
        if (s1.size() != s2.size()) {   // 提前解决s1 s2长度不一样的情况
            return false;
        }

        unordered_map<char, int> hash;
        for (char e : s1) {   // 一边加
            hash[e] += 1;
        }
        for (char e : s2) {   // 另一边减
            hash[e] -= 1;
        }

        for (auto kv : hash) {
            if (kv.second != 0) {  
                return false;
            }
        }

        return true;
    }
};

在这里,我特别想感谢一下 auto for 的存在,如果没有 auto for,那么会非常的窒息......

cpp 复制代码
for (unordered_map<char, int>::iterator it = hash.begin(); 
    \ it != hash.end(); it++) {
            if (it->second != 0) {
                return false;
            }
        }

喝完咖啡回来想了想,好像也不用再迭代器判断一遍,s2 的 for 当前元素 -1 后发现<0 的话就可以直接 return false 了,<0 肯定是因为 s1 里压根就没出现过这个字符 (没记录到哈希桶里)...... 但这样就 必须要对 s1 和 s2 进行长度判断,长度不同直接 return false。

cpp 复制代码
class Solution {
public:
    bool CheckPermutation(string s1, string s2) {
        if (s1.size() != s2.size()) {
            return false;
        }

        unordered_map<char, int> hash;
        for (char& e : s1) {   // 一边加
            hash[e] += 1;
        }
        for (char& e : s2) {   // 另一边减
            hash[e] -= 1;
            if (hash[e] < 0) {
                return false;
            }
        }

        return true;
    }
};

测试,if (<0) 就不能重排。

cpp 复制代码
s1 = a a b b c
s2 = a a b c c
入桶(+):a:2  b:2  c:1    
检查(-):a:0  b:1  c:-1
return false;

s1 = a b c
s2 = b c a
入桶(+):a:1  b:1  c:1    
检查(-):a:0  b:0  c:0
return true;

s1 = a b c
s2 = b a d
入桶(+):a:1  b:1  c:1    
检查(-):a:0  b:0  d:-1
return false;

也可以直接定义一个维护 128 个字符的数组:

cpp 复制代码
class Solution {
public:
    bool CheckPermutation(string s1, string s2) {
        if (s1.size() != s2.size()) {
            return false;
        }

        vector<int> table(128, 0);

        for (char& ch : s1) {
            table[ch]++;
        }

        for (char& ch : s2) {
            table[e]--;
            if (table[e] < 0) {
                return false;
            }
        }

        return true;
    }
};

cpp 复制代码
📌 [ 笔者 ]   王亦优
📃 [ 更新 ]   2023.
❌ [ 勘误 ]   /* 暂无 */
📜 [ 声明 ]   由于作者水平有限,本文有错误和不准确之处在所难免,
              本人也很想知道这些错误,恳望读者批评指正!

|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 📜 参考资料 C++reference[EB/OL]. []. http://www.cplusplus.com/reference/. Microsoft. MSDN(Microsoft Developer Network)[EB/OL]. []. . 百度百科[EB/OL]. []. https://baike.baidu.com/. 牛客网. 剑指offer 题解 [EB/OL]. []. https://www.nowcoder.com/exam/oj/ta?tpId=13. |

相关推荐
C++_girl16 小时前
缓存未命中
c++·缓存
李游Leo16 小时前
JavaScript事件机制与性能优化:防抖 / 节流 / 事件委托 / Passive Event Listeners 全解析
开发语言·javascript·性能优化
bikong717 小时前
桥接模式,打造灵活可扩展的日志系统C++
c++·桥接模式
艾莉丝努力练剑17 小时前
【C++】类和对象(下):初始化列表、类型转换、Static、友元、内部类、匿名对象/有名对象、优化
linux·运维·c++·经验分享
疋瓞17 小时前
C++_STL和数据结构《1》_STL、STL_迭代器、c++中的模版、STL_vecto、列表初始化、三个算法、链表
数据结构·c++·算法
JJJJ_iii17 小时前
【左程云算法09】栈的入门题目-最小栈
java·开发语言·数据结构·算法·时间复杂度
枫叶丹417 小时前
【Qt开发】显示类控件(三)-> QProgressBar
开发语言·qt
三体世界17 小时前
测试用例全解析:从入门到精通(1)
linux·c语言·c++·python·功能测试·测试用例·测试覆盖率
Bear on Toilet17 小时前
继承类模板:函数未在模板定义上下文中声明,只能通过实例化上下文中参数相关的查找找到
开发语言·javascript·c++·算法·继承
程序员东岸18 小时前
C语言入门指南:字符函数和字符串函数
c语言·笔记·学习·程序人生·算法