检查两个字符串是否彼此置换

时间:2019-07-06 12:14:01

标签: c++ algorithm

我正在解决一个难题,该难题需要检查两个字符串在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;
}

4 个答案:

答案 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数据结构,并找到两个字符串中每个元素的频率。如果任何字符的频率不同,则表示错误。