面试题 01.02: 判定是否互为字符重排(C++)
Posted wzw0625
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试题 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; } };
以上是关于面试题 01.02: 判定是否互为字符重排(C++)的主要内容,如果未能解决你的问题,请参考以下文章
字符串程序员面试经典面试题01.02 - 判定是否互为字符重排