01.02、判定是否互为字符重排

01.02、简单 判定是否互为字符重排

1、题目描述

给定两个由小写字母组成的字符串 s1s2,请编写一个程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。

在这道题中,我们的任务是判断两个字符串 s1s2 是否可以通过重新排列字符使得其中一个字符串变为另一个字符串。这意味着,我们需要检查这两个字符串是否包含完全相同的字符,并且每个字符的数量也必须相同。

2、方法一:排序比较法

2.1、思路解析

如果两个字符串是彼此的排列,那么对这两个字符串进行排序后,它们应该完全相同。因此,我们可以通过以下步骤来实现:

  1. 长度判断 :首先,检查 s1s2 的长度。如果长度不同,直接返回 false
  2. 排序 :对 s1s2 分别进行排序。
  3. 比较 :比较排序后的两个字符串是否相等。如果相等,返回 true,否则返回 false
2.2、代码实现
复制代码
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;
    }
};

3、方法二:哈希表计数法

3.1、思路解析

另一种方法是使用哈希表记录每个字符的出现次数。如果两个字符串是彼此的排列,那么每个字符在两个字符串中的出现次数必须相同。因此,我们可以通过以下步骤来实现:

  1. 长度判断 :首先,检查 s1s2 的长度。如果长度不同,直接返回 false
  2. 字符计数 :使用一个长度为 26 的数组 hash 来记录 s1 中每个字符的出现次数,并在遍历 s2 的过程中减去相应字符的计数。
  3. 判断字符计数 :如果在遍历 s2 的过程中发现某个字符的计数小于 0,说明 s2 中包含了 s1 没有的字符,返回 false
  4. 返回结果 :遍历结束后,如果所有字符的计数都为 0,返回 true
3.2、代码实现
复制代码
class Solution {
public:
    bool CheckPermutation(string s1, string s2) {
        // 如果两个字符串长度不同,必然不能是彼此的排列
        if (s1.size() != s2.size()) {
            return false;
        }

        // 使用哈希表记录每个字符的出现次数
        int hash[26] = {0};

        // 统计 s1 中每个字符的出现次数
        for (const auto& ch : s1) {
            hash[ch - 'a']++;
        }

        // 遍历 s2,减去相应字符的计数
        for (const auto& ch : s2) {
            hash[ch - 'a']--;
            // 如果发现某个字符的计数小于 0,返回 false
            if (hash[ch - 'a'] < 0) {
                return false;
            }
        }

        // 如果遍历结束后没有发现问题,返回 true
        return true;
    }
};

4、总结

这两种方法都可以有效地判断两个字符串是否为彼此的排列。方法一使用排序比较,简单直观;方法二使用哈希表计数,时间复杂度更低。具体选择哪种方法,可以根据具体情况和需求来决定。

相关推荐
hahaha601620 分钟前
HLS高层次综合设计技巧--数组
开发语言·嵌入式硬件·算法·fpga开发
不会就选b26 分钟前
算法日常・每日刷题--<贪心>10
算法
南京兴帝文化传媒有限公司29 分钟前
本地生活服务商户GEO优化技术实践:AI大模型收录机制与地图POI权重算法拆解
大数据·人工智能·算法·生活·geo优化实操·csdn运营技巧·ai内容收录
linx2951 小时前
单元九 · 零基础路线图-第 7–9 周·类与 RAII
c语言·开发语言·数据结构·c++·嵌入式硬件·算法
布莱克6051 小时前
C++ 七大排序算法详解:选择、冒泡、插入、计数、堆、快速与归并排序
数据结构·c++·算法·排序算法
shehuiyuelaiyuehao2 小时前
算法44,模拟算法,数青蛙
算法·哈希算法·散列表
hanlin032 小时前
刷题笔记:力扣第287题-寻找重复数
笔记·算法·leetcode
kevin_kang2 小时前
第02章 对话时间线与延迟分析
算法
科学实验家3 小时前
最小生成树:Prim,kruskal
数据结构·c++·算法
学习智者3 小时前
《玄》IDE v3.6.3重磅发布:全功能修复与性能飞跃
开发语言·c++·ide·算法·中文语言 玄