给定一个二进制字符串,即它只包含0和1(零的数量等于1的数量)我们需要通过交换一些位来使这个字符串成为一个替代字符序列,我们的目标是最小化数字交换。
例如,对于字符串“00011011”,最小交换次数为2,其中一种方法是:
1)交换位:00011011 --->> 00010111
2)交换位(第一次交换后):00010111 --->> 01010101
请注意,如果给出字符串“00101011”,我们可以将其转换为以0开头的备用字符串(需要3次交换),也可以转换为以1开头的备用字符串(需要一次交换 - 第一次和最后一次交换)位)。 因此,在这种情况下,最小值是一次交换。
最终目标是返回给定1和0字符串的最小交换次数。解决问题的最有效方法是什么?
答案 0 :(得分:0)
您正在寻找的是Levenshtein distance。它有点复杂,因为它适用于所有类型的String而不仅仅是位串,但基于实现,您应该能够开发自己的拟合解决方案。这是我在Wikibooks上找到的java实现:
public static int computeLevenshteinDistance(CharSequence lhs, CharSequence rhs) {
int[][] distance = new int[lhs.length() + 1][rhs.length() + 1];
for (int i = 0; i <= lhs.length(); i++)
distance[i][0] = i;
for (int j = 1; j <= rhs.length(); j++)
distance[0][j] = j;
for (int i = 1; i <= lhs.length(); i++)
for (int j = 1; j <= rhs.length(); j++)
distance[i][j] = minimum(
distance[i - 1][j] + 1,
distance[i][j - 1] + 1,
distance[i - 1][j - 1] + ((lhs.charAt(i - 1) == rhs.charAt(j - 1)) ? 0 : 1));
return distance[lhs.length()][rhs.length()];
}