判定是否互为字符重排
给定两个由小写字母组成的字符串 s1 和 s2,请编写一个程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。
示例 1:
输入: s1 = “abc”, s2 = “bca”
输出: true
示例 2:
输入: s1 = “abc”, s2 = “bad”
输出: false
说明:
0 < = l e n ( s 1 ) < = 100 0 <= len(s1) <= 100 0<=len(s1)<=100
0 < = l e n ( s 2 ) < = 100 0 <= len(s2) <= 100 0<=len(s2)<=100
题解:
如果两个字符串长度不同,那么直接
false
否则直接排序然后判断是否相等,非常暴力 (纯C玩家不要轻易尝试)
C++
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;}
};
Python3:
class Solution:def CheckPermutation(self, s1: str, s2: str) -> bool:return sorted(s1) == sorted(s2)
题解2:
使用一个数组记录字母出现次数,再进行判断
class Solution {
public:bool CheckPermutation(string s1, string s2) {if(s1.size()!=s2.size())return false;int a[26]={0};for(int i=0;i<s1.size();i++)a[s1[i]-'a']++;for(int i=0;i<s2.size();i++)a[s2[i]-'a']--;for(int i=0;i<26;i++)if(a[i]!=0)return false;return true;}
};
当然, s 1. s i z e ( ) = = s 2. s i z e ( ) s1.size()==s2.size() s1.size()==s2.size()
class Solution {
public:bool CheckPermutation(string s1, string s2) {if(s1.size()!=s2.size())return false;int a[26]={0};for(int i=0;i<s1.size();i++)a[s1[i]-'a']++,a[s2[i]-'a']--;for(int i=0;i<26;i++)if(a[i]!=0)return false;return true;}
};
C
bool CheckPermutation(char* s1, char* s2){if(strlen(s1)!=strlen(s2))return false;int a[26]={0};for(int i=0;i<strlen(s1);i++)a[s1[i]-'a']++,a[s2[i]-'a']--;for(int i=0;i<26;i++)if(a[i]!=0)return false;return true;
}
题解3:
还记得上一道题的int 模拟 bool数组吗?
不过这一次需要再加一个,因为可能存在进位的情况,然后减去的是进位后的数字,那么就无法保证成对存在了,需要再来一个int确保
class Solution {
public:bool CheckPermutation(string s1, string s2) {if(s1.size()!=s2.size())return false;int mark=0;int mark2=0;for(int i=0;i<s1.size();i++)mark += 1<<(s1[i]-'a'),mark -= 1<<(s2[i]-'a'),\mark2 ^= 1<<(s1[i]-'a'),mark2 ^= 1<<(s2[i]-'a');return !mark&&!mark2;}
};