【发布时间】:2013-09-10 22:04:25
【问题描述】:
给定三个字符串 A、B 和 C。编写一个函数,检查 C 是否是 A 和 B 的交织。如果 C 包含 A 和 B 的所有字符以及所有字符的顺序,则称 C 是交织 A 和 B单个字符串中的字符被保留。
例如:
- 'hotdog' 是 'hot' 和 'dog' 的交错(简单)
- “superb”是“up”和“serb”的交织
- “heartache”是“ear”和“ache”的交织
- 'chat' 是 'hat' 和 'cat' 的交织
- 'cheaters' 不是 'chat' 和 'seer' 的交错,因为虽然它包含来自每个人的所有字母,但来自 'seer' 的字母并没有按顺序出现
我在 net 中找到了一些解决方案,但下面是我的方法,有人可以告诉我我是否遗漏了什么或 我的算法会起作用吗?谢谢。
我的算法:
- 遍历
a和c。在遍历时,我们首先计算两件事:char 是否存在并保存索引,即找到 char 的f。一旦我们找到这个字符,我们应该在那个地方放一些特殊的字符,这样我们就不会再考虑这个字符了。 - 对于
a中的下一个字符,从您找到前一个字符的索引中搜索c,即f。如果我们没有找到,则返回。 -
b也是如此。 - 如果在执行上述步骤后,如果我们找到
false,而不是重复第一个b而不是a,并返回结果。
例如
a = xxy, b = xxz and c = xxzxxxy
以:开始
- 对于 a 中的 x,c = 0xzxxxy(我将 0 作为特殊字符)
- 对于 a 中的 x,从索引 0 开始(因为我们在 0 处找到了前一个字符)c = 00zxxxy。
- 对于 a 中的 y,c = 00zxxx0
- 对于 b 中的 x,c = 00z0xx0
- 对于 b 中的 x,c = 00z00x0
- 对于 b 中的 z,我们在索引 4 之后找不到 z,这是我们找到 b 的前一个字符的索引。
因为以
a开头返回 false,所以我们现在将从 b 开始。所以从 b 开始:
- 对于 b 中的 x,c = 0xzxxxy
- 对于 b 中的 x,c = 00zxxxy
- 对于 b 中的 z,c = 000xxxy
- 对于 a 中的 x,c = 0000xxy
- 对于 a 中的 x,c = 00000xy
- 对于 a 中的 y,c = 00000x0
因此 true i.e.c 是 a 和 b 的交错字符串。
【问题讨论】:
-
我怀疑这是一个比一开始听起来更复杂的问题,因为您很容易走错路而不得不回溯。
-
这可以随心所欲吗?还是您必须满足复杂性要求?
-
@Cruncher 上面的解决方案是 O(N^2)。您可以对上述算法发表意见,也可以自己发表意见。
-
@Trying:为什么要删除链接?我认为 DP 解决方案是您能找到的最佳解决方案之一。
-
@nhahtdh 你想让我恢复它吗?我想在这里重新尝试解决方案。