我正在解决一个难题,该难题需要检查两个字符串在O(N)中是否用O(1)空间彼此置换。
所以我的想法是将两个字符串连接起来,如果结果为零,则对结果进行异或运算。
但是它仅在一个测试用例中失败
Input1: pro
Input2: pro
Pass
Input1: firecode
Input2: firecoat
Pass
Input1: firecode
Input2: codefire
Pass
Input1: abcd
Input2: cadb
Pass
Input1: GOD
Input2: DOG
Pass
Input1: [Empty]
Input2: [Empty]
Pass
Input1: firecode
Input2: firec
Pass
Input1: bbbb
Input2: dddd
Fail
这是我的实现:
bool permutation(string input1, string input2)
{
string conct = input1+input2;
int result = 0;
for (int i =0; i < conct.size(); i++)
{
result^=conct[i];
}
return result ==0;
}
答案 0 :(得分:4)
一个经典的O(n)解决方案,其O(1)额外空间对可能值很少的数据很有用,它是建立一个出现表并计算每个元素出现的次数。对于字符串来说,这很简单:
mmap
请注意,我读取了bool permutation(string input1, string input2) {
int count[UCHAR_MAX+1] = {};
for(unsigned char c: input1) count[c]++;
for(unsigned char c: input2) count[c]--;
for(int x: count) {
if(x) return false;
}
return true;
}
中的每个字符,因为纯unsigned char
的签名是由实现定义的,因此您实际上并不想使用负值对数组进行索引。
答案 1 :(得分:1)
只需使用std::is_permutation。
bool permutation(const string &input1, const string &input2)
{
return std::is_permutation(
input1.begin(), input1.end(),
input2.begin(), input2.end());
}
答案 2 :(得分:0)
我认为您的解决方案方法存在逻辑错误。
您要检查的是两个字符串中是否包含相同的字母,并且出现的次数相同。
在您的方法中,您要检查的是,对于每个字母,被修饰的字符串是否出现偶数次。
如果您输入“ Hell”和“ Helloo”,即使这些字符串不是另一个字符串的排列,您也会发现方法的结果为0。
查看ASCII二进制表,您还可以构造“ AB”和“ C @”之类的东西,结果将为0:
A 0100 0001
B 0100 0010 ^= 0000 0011
C 0100 0011 ^= 0100 0000
@ 0100 0000 ^= 0000 0000
result 0000 0000
编辑:更正了解释,添加了另一个示例
答案 3 :(得分:0)
您可以在此处使用Map数据结构,并找到两个字符串中每个元素的频率。如果任何字符的频率不同,则表示错误。