到达字符串的最小替换数:01010101 ... 01或10101010 ... 10

时间:2017-12-25 11:25:36

标签: java

给定一个二进制字符串,即它只包含0和1(零的数量等于1的数量)我们需要通过交换一些位来使这个字符串成为一个替代字符序列,我们的目标是最小化数字交换。

例如,对于字符串“00011011”,最小交换次数为2,其中一种方法是:

1)交换位:00011011 --->> 00010111

2)交换位(第一次交换后):00010111 --->> 01010101

请注意,如果给出字符串“00101011”,我们可以将其转换为以0开头的备用字符串(需要3次交换),也可以转换为以1开头的备用字符串(需要一次交换 - 第一次和最后一次交换)位)。 因此,在这种情况下,最小值是一次交换。

最终目标是返回给定1和0字符串的最小交换次数。解决问题的最有效方法是什么?

1 个答案:

答案 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()];                           
}