当前位置: 首页 > 知识库问答 >
问题:

更改字符串使其相等

澹台建华
2023-03-14

关于这里的问题

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

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

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

看起来这必须用动态规划来解决。但我不能得出方程式。有人建议他们回答这个问题,但看起来不太好。

dp[i][j] = 
Min{ 
dp[i + 1][j - 1] + 1, if str1[i] = str2[j] && str1[j] = str2[i]
dp[i + 2][j] + 1, if str1[i] = str2[i + 1] && str1[i + 1] = str2[i]
dp[i][j - 2] + 1, if str1[j] = str2[j - 1] && str1[j - 1] = str2[j]
}
In short, it's 
dp[i][j] = Min(dp[i + 1][j - 1], dp[i + 2][j], dp[i][j - 2]) + 1.
Here dp[i][j] means the number of minimum swaps needs to swap str1[i, j] to str2[i, j]. Here str1[i, j] means the substring of str1 starting from pos i to pos j :)

Here is an example like the one in the quesition,
str1 = "aab",
str2 = "baa"

dp[1][1] = 0 since str1[1] == str2[1];
dp[0][2] = str1[0 + 1][2 - 1] + 1 since str1[0] = str2[2] && str1[2] = str2[0].

共有1个答案

全昊焜
2023-03-14

你有两个原子操作:

>

  • 与成本1互换

    交换第一和最后与成本1

    一个有趣的事实:

    1. 和2.是相同的,如果字符串结束将连接到字符串开始(循环字符串)

    这样我们就可以得到一个更通用的操作

    这个问题对我来说似乎不是二维的,或者说我无法确定维度。将此算法视为天真的方法:

    private static int transform(String from, String to) {
        int commonLength = to.length();
        List<Solution> worklist = new ArrayList<>();
        worklist.add(new Solution(0,from));
        while (!worklist.isEmpty()) {
            Solution item = worklist.remove(0);
            if (item.remainder.length() == 0) {
                return item.cost;
            } else {
                int toPosition = commonLength - item.remainder.length();
                char expected = to.charAt(toPosition);
                nextpos : for (int i = 0; i < item.remainder.length(); i++) {
                    if (item.remainder.charAt(i) == expected) {
                        Solution nextSolution = item.moveCharToBegin(i, commonLength);
                        for (Solution solution : worklist) {
                            if (solution.remainder.equals(nextSolution.remainder)) {
                                solution.cost = Math.min(solution.cost, nextSolution.cost);
                                continue nextpos;
                            }
                        }
                        worklist.add(nextSolution);
                    }
                }
            }
        }
        return Integer.MAX_VALUE;
    }
    
    private static class Solution {
        public int cost;
        public String remainder;
    
        public Solution(int cost, String remainder) {
            this.cost = cost;
            this.remainder = remainder;
        }
    
        public Solution moveCharToBegin(int i, int length) {
            int costOffset = Math.min(i, length - i); //minimum of forward and backward circular move
            String newRemainder = remainder.substring(0, i) + remainder.substring(i + 1);
            return new Solution(cost + costOffset, newRemainder);
        }
    }
    

  •  类似资料:
    • 目前,我有一个很大的JavaScript字符串,我正试图写入一个文件,但编码方式不同(ISO-8859-1)。我希望使用类似downloadify的东西。Downloadify只接受普通JavaScript字符串或base64编码字符串。 因此,我决定使用JSZip压缩我的字符串,JSZip生成一个很好的base64编码字符串,可以传递给downloadify并下载到我的桌面。胡萨!问题是,我压缩

    • 我认为每次更改字符串后,Python字符串的id都必须更改。但我发现真正的行为是不同的。例如,并非输出下面的所有代码字符串都不同: 这就是为什么我认为Python内核正在尝试优化代码,并开始对内存中的字符串进行奇怪的操作。该假设的另一个论点是,常量ID与大小为2的幂的段相关联: 但这其中还有一件奇怪的事。让我们看看随着字符串大小的增加,段大小会发生什么变化: 最后,我们可以尝试近似地将char添加

    • 我必须使用itextpdf api创建一个pdf。我在这个项目中也有j汤api。我已经设法创建了一个pdf,它满足了所有的要求,除了一件事。pdf中的一列单元格必须从网络应用程序UI从html内容中获取它们的内容文本。所以,我把所有的标签和所有的标签都拿到了pdf。像这样: 现在我找到了一种通过使用Jsoup摆脱标记的方法。解析(cellContentText)。text(); 然而,现在没有线路

    • python中的字符串是不可变的对象。更改字符串应该会创建一个新对象,从而创建一个新id。 出于某种原因,当我尝试执行一个简单的字符串连接时,有时id会改变,有时则不会。我注意到当我所做的更改很小时,它往往不会改变id,但这似乎不是一个足够好的解释。只是想知道为什么会发生这种情况。 这是我闲置shell的截图。如果有人能解释一下,我会非常感激:) id有时更改,有时不更改的示例

    • 本文向大家介绍JavaScript更改字符串的大小写,包括了JavaScript更改字符串的大小写的使用技巧和注意事项,需要的朋友参考一下 JavaScript提供了两个方法,将字符串转换为全部大写或全部小写,从而可以将“hello”更改为“HELLO”,或者将“NOT”更改为“not”。你可能会问,为什么?将字符串中的字母转换为相同的大小写,这可以使得比较两个字符串变得更容易。例如,假设你创建了

    • 我想将我的IDE连接到OracleSQLDeveloper。因此我必须使用这行代码: 要输入密码,我使用: 我想知道如何将这个JPasswordField转换成字符串,这样我就可以使用代码I的“Connect”行(这一行仅适用于字符串) 编辑:这是输入密码的代码。我在stackoverflow上找到了它: