将第一个字符串设为第二个字符串的Anagram吗?

时间:2015-12-23 07:19:42

标签: optimization anagram

每个测试用例将包含一个长度为len(S1)+ len(S2)的字符串,它将是两个字符串的串联。给定的字符串将只包含a到z的字符。

任务

找到第一个字符串最小字符数(这将是给定字符串的上半部)需要更改为使其成为第二个字符串的字谜。(将是给定字符串的后半部分)。

输入:

aaabbb

输出:3

因为3 a(s)需要被3 b(s)替换,string1(aaa)是string2(bbb)的字谜

我的方法:

如果字符串长度不均匀..那么上半部分不能是下半部分的字谜...那么打印-1

否则:

  1. 我计算每个字母表中的字符数,并将其存储为26个元素的数组。表示a-z中每个字母表的重复次数。

  2. 我为2个字符串制作了2个这样的数组。

  3. 3.我检查两个数组以打印需要更改的字符数。因为我需要让第一个字符串成为第二个字符串...我将检查两个数组。

    Firststring [i]> SecondString [i] ...递增计数!

    此方法需要o(n ^ 2)时间。 (遍历每个字符串和表单数组)。

    我需要一个更好的解决方案!

1 个答案:

答案 0 :(得分:1)

以线性时间(O(n))运行的非常简单的方法如下:

  • 让我们调用两个子字符串strAstrB进行后续讨论。对于每个子字符串:将字符串中的字符映射到一个数组,该数组包含字符串中特定字符的出现次数。例如,如果在字符串中只假设非大写字母,则将每个字符的ASCII值映射到大小为26(英文字母)的整数数组的条目,将ASCII值移动-96以获得映射 ASCII (a ... z) - >索引(0 ... 25)。让我们称这些"出现次数"在讨论之后的数组ab,分别对应于子字符串strAstrB
  • 此后,对于i的每个索引a[i] * b[i] > 0(0 ... 25),值min(a[i], b[i])向我们显示a和{{}中的合规顺序1}},用于与索引i相关联的字符。
  • 符合性顺序的总和使我们得到子串bstrA之间的总符合性,如果此总和等于这些子串的长度(具有相同的长度或返回)是strB),那么tw子串-1strA是彼此的字谜。

以下示例显示了Swift中的这个实现,但是我使用了一种纯粹的命令式方法,因此它可以很容易地翻译成您喜欢的编程语言。

strB