Algorithm 字符串换位算法

Algorithm 字符串换位算法,algorithm,string,Algorithm,String,假设给定两个字符串: String s1= "MARTHA" String s2= "MARHTA" 这里我们交换T和H的位置。我感兴趣的是编写代码,计算从一个字符串转换到另一个字符串需要多少更改。有几种算法,给定的Wikipeida链接有一些链接。您的问题不是那么容易,因为在计算掉期之前,您需要确保每次掉期都会减少这两个字符串之间的“距离”(相等)。然后,实际上您要寻找计数,但您应该寻找最小的计数(或者至少我认为是这样),否则存在无限的方法来交换一个字符串以获得另一个 您应该首先检查哪些字符

假设给定两个字符串:

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

这里我们交换T和H的位置。我感兴趣的是编写代码,计算从一个字符串转换到另一个字符串需要多少更改。

有几种算法,给定的Wikipeida链接有一些链接。

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

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


如果您不想有效地进行交换,而只是计算交换的数量,请使用一个位数组,其中每个位置正确的字符都有
1
,否则为
0
。当每个位都是
1
时,您将完成此操作。假设距离仅计算交换,这里有一个基于排列的想法,它以线性时间运行

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

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

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

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


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

哇,110个问题,3个答案,只有6张投票?这确保了最低的互换数量。怎么办?如果你只是盲目地交换元素,你可能会陷入一个无限循环,或者至少会陷入一个没有完成字符串转换的死胡同。如果你保证每一步都能缩短距离,你怎么能在无限循环中结束呢?它可以卡住,确保两个字符串不是“交换相等”,但它不能保证不做任何事情就循环。这种方法被称为贪婪法,它确保,如果保持局部最优(通过每次迭代减少距离ad),那么全局最优是一个直接结果。然后我假设我们讨论的是两个项目的互换,其中没有像
I=j+1
或反之亦然的约束。另外,因为OP没有说相邻交换,只是交换。是的,它被称为贪婪,你必须证明你的贪婪算法是有效的,因为贪婪算法通常只适用于非常狭窄和特定类型的问题。你不会在一个无限循环中结束,但当两者实际上“交换相等”时,你可能会陷入困境,否则你可能找不到最好的解决方案。基本上,你需要证明你的算法是正确的。正如我在回答中指出的,如果我们假设没有重复的数字,那么这可以在线性时间内解决。我想听听您对如何改进它以涵盖非唯一字母的情况的意见。所有这些都不考虑互换。