【问题标题】:Java minimum string movement?Java最小字符串移动?
【发布时间】:2014-09-19 12:48:42
【问题描述】:

几天前我遇到了这样一个问题:

我们有两个字符串 A 和 B 具有相同的超级字符集。我们需要改变这些字符串以获得两个相等的字符串。在每一步中,我们都可以执行以下操作之一:

1- 交换字符串的两个连续字符 2-交换字符串的第一个和最后一个字符

可以对任一字符串执行移动。 为了获得两个相等的字符串,我们需要的最小移动次数是多少? 输入格式和约束: 输入的第一行和第二行包含两个字符串 A 和 B。保证它们的字符相等的超集。 1

输出格式: 将最小移动次数打印到输出的唯一行

示例输入: aab 咩

示例输出: 1

说明: 交换字符串 aab 的第一个和最后一个字符以将其转换为 baa。这两个字符串现在相等了。

我一直在尝试不同的算法,但没有成功。我一直在做一些让他们平等但从来没有最小运动的事情。

编辑:我的伪代码是:

swap=>moves++

begin

 if(A[0]!=B[0]){
  if(A[0]==B[length-1]){
   swap(B[0], B[length-1]);
  }
  else if(B[0]==A[length-1]){
   swap(A[0],A[length-1]);
  }
 }
for(int i=0;i<A.length();i++){
 if(A[i]==B[i]){
  continue;
 }
 for(int j=i+1;j<A.length();j++){
  if(A[i]==B[j]){
   for(int k=j;k>i;k--){
    swap(B[k],B[k-1]);
   }
 break;
  else if(B[i]=A[j]){
   for(int k=j;k>i;k--){
    swap(A[k],A[k-1]);
   }
 break;
 }
}if(A==B){
break;
}

对于一些不清楚这一点的人,我的问题是如何让它发挥作用,任何想法,任何事情。因为此刻,我很无知。

编辑: 所以这是我迄今为止做的最好的主意:

    public static void swap(char aChar, char bChar) {
        char cChar;
        cChar = aChar;
        aChar = bChar;
        bChar = cChar;
    }

    public static void main(String[] args) {
        int moves = 0;
        Scanner scanner = new Scanner(System.in);
        System.out.println("Enter the string A:");
        while (!scanner.hasNext("[A-Za-z]+")) {
            System.out
                    .println("Nope, that's not it! Enter the value from \"a\" to \"z\"."
                            + "Enter your string A again!");
            scanner.nextLine();
        }
        String a = scanner.nextLine();
        a.toLowerCase();
        System.out.println("Enter the string B:");
        while (!scanner.hasNext("[A-Za-z]+")) {
            System.out
                    .println("Nope, that's not it! Enter the value from \"a\" to \"z\"."
                            + "Enter your string B again!");
            scanner.nextLine();
        }
        String b = scanner.nextLine();
        b.toLowerCase();
        scanner.close();
        char[] aChar = a.toCharArray();
        char[] bChar = b.toCharArray();
        if ((a.length() >= 1 && a.length() <= 2000) && a.length() == b.length()) {
            if (aChar[0] != bChar[0]) {
                if (aChar[0] == bChar[bChar.length - 1]) {
                    swap(bChar[0], bChar[bChar.length - 1]);
                    moves++;
                } else if (bChar[0] == aChar[aChar.length - 1]) {
                    swap(aChar[0], aChar[bChar.length - 1]);
                    moves++;
                }
            }
            for (int i = 0; i < aChar.length; i++) {
                if (aChar[i] == bChar[i]) {
                    continue;
                }
                for (int j = i + 1; j < aChar.length; j++) {
                    if (aChar[i] == bChar[j]) {
                        for (int k = j; k > i; k--) {
                            swap(bChar[k], bChar[k - 1]);
                            moves++;
                        }
                        break;
                    } else if (bChar[i] == aChar[j]) {
                        for (int k = j; k > i; k--) {
                            swap(aChar[k], aChar[k - 1]);
                            moves++;
                        }
                        break;
                    }
                }
                if (aChar == bChar) {
                    break;
                }
            }
            System.out.println("Minimum moves: " + moves);
        }
    }
}

问题在于它没有给出最小的移动次数。可悲的是。 :)

将尝试在此代码中添加更多东西,它可能会起作用,但现在,这就是我所拥有的......

【问题讨论】:

  • 你的问题是什么?
  • 向我们展示您尝试过的一种算法,我们可以为您提供帮助。这不是编码服务。
  • 我认为(但不确定)您可以通过归纳证明仅对两个字符串之一进行操作就足够了,比如说第二个。这使您可以将两个字符串之一视为固定的。
  • 另外,如果字符串被认为是循环的,那么交换第一个和最后一个字符可以看作交换两个连续的字符。这进一步将可能的逻辑移动集限制为从第一个字符串中选择一个字符并将其与紧随其后的字符交换。
  • 据我所知,这是stackoverflow.com/questions/7797540/…的副本

标签: java string algorithm


【解决方案1】:
public int findMinimumStringMovement() {
    int moves = 0;
    char[] aChar = a.toCharArray();
    char[] bChar = b.toCharArray();
    char cChar;

    if (aChar != bChar) {
        for (int i = 0; i < aChar.length; i++) {
            for (int j = i + 1; j < aChar.length; j++) {
                if (aChar[i] != bChar[i]) {
                    /*
                     * It checks if some character from the array of aChar
                     * is same as other character from the array of B and if
                     * it's j less then the length of the array. If it's
                     * true, then swap the characters and count moves
                     */
                    if (aChar[j] == bChar[i] && j < aChar.length) {
                        for (int k = j; k > i; k--) {
                            cChar = aChar[k];
                            aChar[k] = aChar[k - 1];
                            aChar[k - 1] = cChar;
                            moves++;
                        }
                        /*
                         * In other case, if the last character of array
                         * aChar same as the some character of bChar and
                         * vice versa, then we should check if the i is
                         * equal to 0, in that case we swap 1st and last
                         * character of array and count as 1 move else if i
                         * value is less then the value of length of array
                         * divided with 2 then it swaps that character to
                         * the first one and then swaps with last and counts
                         * the moves.
                         */
                    } else if (aChar[aChar.length - 1] == bChar[i]) {
                        if (i == 0) {
                            cChar = aChar[aChar.length - 1];
                            aChar[aChar.length - 1] = aChar[i];
                            aChar[i] = cChar;
                            moves++;
                        } else if (i < (aChar.length - 1) / 2) {
                            for (int k = i; k > 0; k--) {
                                cChar = aChar[k];
                                aChar[k] = aChar[k - 1];
                                aChar[k - 1] = cChar;
                                moves++;
                            }
                            cChar = aChar[i];
                            aChar[i] = aChar[aChar.length - 1];
                            aChar[aChar.length - 1] = cChar;
                        }
                    } else if (bChar[bChar.length - 1] == aChar[i]) {
                        if (i == 0) {
                            cChar = bChar[bChar.length - 1];
                            bChar[bChar.length - 1] = bChar[i];
                            bChar[i] = cChar;
                            moves++;
                        } else if (i < (aChar.length - 1) / 2) {
                            for (int k = i; k > 0; k--) {
                                cChar = aChar[k];
                                aChar[k] = aChar[k - 1];
                                aChar[k - 1] = cChar;
                                moves++;
                            }
                            cChar = aChar[i];
                            aChar[i] = aChar[aChar.length - 1];
                            aChar[aChar.length - 1] = cChar;
                            moves++;
                        }
                        /*
                         * And the last case is if there is no other option,
                         * then we asks if some characters in array with
                         * positions i and j are different and if the j
                         * value is less then length of the array and do the
                         * swap.
                         */
                    } else {
                        if (aChar[j] != aChar[i] && j < aChar.length) {
                            if (aChar[j] == bChar[j]) {
                                cChar = bChar[j];
                                bChar[j] = bChar[i];
                                bChar[i] = cChar;
                                moves++;
                            }
                            cChar = aChar[j];
                            aChar[j] = aChar[i];
                            aChar[i] = cChar;
                            moves++;
                        } else if (bChar[j] != bChar[i] && j < aChar.length) {
                            if (aChar[j] == bChar[j]
                                    && aChar[j] != aChar[i]) {
                                cChar = aChar[j];
                                aChar[j] = aChar[i];
                                aChar[i] = cChar;
                                moves++;
                            }
                            cChar = bChar[j];
                            bChar[j] = bChar[i];
                            bChar[i] = cChar;
                            moves++;
                        }
                    }
                    /*
                     * At the end, if arrays are equal, then it is done.
                     */
                    if (aChar == bChar) {
                        break;
                    }
                }
            }
        }
    }
    return moves;
}

我希望你们会发现它对你们有帮助。很抱歉花了这么长时间才发布它。 最好的问候。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-26
    • 1970-01-01
    • 2013-12-13
    • 1970-01-01
    相关资源
    最近更新 更多