• 面试题 01.02: 判定是否互为字符重排(C++)


    题目地址:https://leetcode-cn.com/problems/check-permutation-lcci/

    题目描述

    给定两个字符串 s1 和 s2,请编写一个程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。

    题目示例

    示例 1:

    输入: s1 = "abc", s2 = "bca"
    输出: true
    示例 2:

    输入: s1 = "abc", s2 = "bad"
    输出: false

    解题思路

    思路1:判断两个字符串能否构成同一个字符串,首要条件便是两者长度相同,只有中这个大条件下才能谈及其它,所以,首先判断两者长度是否相同,其次,我们对两字符串进行排序,这样的好处是我们可以直接使用一层循环判断两字符串对应元素是否相同,当发现有不同元素时,直接返回false即可。

    思路2:哈希表。同样的思路,不过与思路1的区别是我们要对字符串s2中的每个元素出现的次数进行比较。

    思路3:使用双哈希表存储每个字符串中的字符出现的次数,然后判断两个哈希表中元素是否相同即可。

    程序源码

    思路1

    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());
            for(int i = 0; i < s1.size(); i++)
            {
                if(s1[i] != s2[i]) return false;
            }
            return true;
        }
    };

    思路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());
            unordered_map<char, int> mp;
            for(int i = 0; i < s1.size(); i++)
            {
                mp[s1[i]]++;
            }
            for(int j = 0; j < s2.size(); j++)
            {
                mp[s2[j]]--;
                if(mp[s2[j]] < 0) return false;
            }
            return true;
        }
    };

    思路3

    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());
            unordered_map<char, int> mp_s1;
            unordered_map<char, int> mp_s2;
            for(int i = 0; i < s1.size(); i++)
            {
                mp_s1[s1[i]]++;
                mp_s2[s2[i]]++;
            }
            for(int j = 0; j < s2.size(); j++)
            {
                if(mp_s1[s1[j]] != mp_s2[s1[j]]) return false;
            }
            return true;
        }
    };
    ----------------------------------- 心之所向,素履所往;生如逆旅,一苇以航。 ------------------------------------------
  • 相关阅读:
    [YTU]_2436( C++ 习题 输出日期时间--友元类)
    [YTU]_2435 ( C++ 习题 输出日期时间--友元函数)
    病毒侵袭
    石子合并(区间DP经典例题)
    AC自动机模板2
    【模板】最近公共祖先(LCA)
    华华给月月出题
    线性筛素数
    华华开始学信息学
    华华和月月种树
  • 原文地址:https://www.cnblogs.com/wzw0625/p/12899743.html
Copyright © 2020-2023  润新知