字符串转置算法

时间:2010-06-19 14:41:03

标签: algorithm string

假设有两个字符串:

String s1= "MARTHA"
String s2= "MARHTA"

这里我们交换T和H的位置。我有兴趣编写代码,计算从一个String转换到另一个String所需的更改次数。

3 个答案:

答案 0 :(得分:6)

有几种edit distance算法,给定的Wikipeida链接包含一些链接。

答案 1 :(得分:3)

假设距离只计算掉期,这里有一个基于排列的想法,它以线性时间运行。

算法的第一步是确保两个字符串的字符内容真的相同。这可以使用哈希表(或覆盖所有字母表的固定数组)在线性时间内完成。如果不是,那么s2不能被视为s1的排列,并且“交换计数”是无关紧要的。

第二步计算将s2转换为s1所需的最小交换次数。这可以通过检查对应于从s1到s2的变换的置换p来完成。例如,如果s1 =“abcde”且s2 =“badce”,那么p =(2,1,4,3,5),意味着位置1包含元素#2,位置2包含元素#1等。置换可以在线性时间内分解为permutation cycles。示例中的循环是(2,1)(4,3)和(5)。最小交换计数是每个周期所需的交换总数。长度为k的周期需要k-1个交换以“固定”它。因此,交换次数为N-C,其中N是字符串长度,C是周期数。在我们的例子中,结果是2(交换1,2然后3,4)。

现在,这里有两个问题,我觉得我现在太累了,无法解决它们。)

1)我的解决方案假设不重复任何字符,但情况并非总是如此。需要进行一些调整才能正确计算交换计数。

2)我的公式#MinSwaps = N-C需要证明......我没有在网上找到它。

答案 2 :(得分:0)

你的问题并不那么容易,因为在计算交换之前,你需要确保每次交换减少这两个字符串之间的“距离”(相等)。然后实际上你会查找计数,但你应该寻找最小的计数(或者至少我想),否则存在无限的方式交换字符串以获得另一个。

首先应该检查哪些字符已经存在,然后对于每个没有查看的字符是否有可以交换的字符,以便减少字符串之间的下一个距离。然后迭代直到你完成这个过程。

如果您不想有效地执行此操作但只计算交换次数,请使用一个位数组,其中每个放置好的字符都有1,否则为0。当每个位都是1时,您将完成。