每个测试用例将包含一个长度为len(S1)+ len(S2)的字符串,它将是两个字符串的串联。给定的字符串将只包含a到z的字符。
任务:
找到第一个字符串的最小字符数(这将是给定字符串的上半部)需要更改为使其成为第二个字符串的字谜。(将是给定字符串的后半部分)。
输入:
aaabbb
输出:3
因为3 a(s)需要被3 b(s)替换,string1(aaa)是string2(bbb)的字谜
我的方法:
如果字符串长度不均匀..那么上半部分不能是下半部分的字谜...那么打印-1 。
否则:
我计算每个字母表中的字符数,并将其存储为26个元素的数组。表示a-z中每个字母表的重复次数。
我为2个字符串制作了2个这样的数组。
3.我检查两个数组以打印需要更改的字符数。因为我需要让第一个字符串成为第二个字符串...我将检查两个数组。
Firststring [i]> SecondString [i] ...递增计数!
此方法需要o(n ^ 2)时间。 (遍历每个字符串和表单数组)。
我需要一个更好的解决方案!
答案 0 :(得分:1)
以线性时间(O(n))运行的非常简单的方法如下:
strA
和strB
进行后续讨论。对于每个子字符串:将字符串中的字符映射到一个数组,该数组包含字符串中特定字符的出现次数。例如,如果在字符串中只假设非大写字母,则将每个字符的ASCII值映射到大小为26(英文字母)的整数数组的条目,将ASCII值移动-96以获得映射 ASCII (a ... z) - >索引(0 ... 25)。让我们称这些"出现次数"在讨论之后的数组a
和b
,分别对应于子字符串strA
和strB
。i
的每个索引a[i] * b[i] > 0
(0 ... 25),值min(a[i], b[i])
向我们显示a
和{{}中的合规顺序1}},用于与索引i相关联的字符。b
和strA
之间的总符合性,如果此总和等于这些子串的长度(具有相同的长度或返回)是strB
),那么tw子串-1
和strA
是彼此的字谜。以下示例显示了Swift中的这个实现,但是我使用了一种纯粹的命令式方法,因此它可以很容易地翻译成您喜欢的编程语言。
strB