欢迎来到王正伟的博客

返回顶部

面试题 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;
    }
};
posted @ 2020-05-16 11:51  Mr.King~  阅读(341)  评论(0编辑  收藏  举报