Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 查找将一个字符串转换为另一个字符串的最小交换次数,其中字符串可能具有重复字符_String_Algorithm_Swap - Fatal编程技术网

String 查找将一个字符串转换为另一个字符串的最小交换次数,其中字符串可能具有重复字符

String 查找将一个字符串转换为另一个字符串的最小交换次数,其中字符串可能具有重复字符,string,algorithm,swap,String,Algorithm,Swap,我正在浏览一个编程问题,突然发现下面的问题似乎有关联 如何使用如下所示的少量交换将一个字符串转换为另一个字符串。字符串保证可相互转换(它们具有相同的字符集,这是给定的),但字符可以重复。我在网上看到了关于同一个问题的结果,但没有重复这些字符。 字符串中的任意两个字符都可以交换 例如:“aabbccdd”可以在两次掉期中转换为“ddbbccaa”,而“abcc”可以在一次掉期中转换为“accb” 谢谢 在从一个字符串到另一个字符串的等效字符串图中进行A*搜索(有关说明,请参阅)。使用Levensh

我正在浏览一个编程问题,突然发现下面的问题似乎有关联

如何使用如下所示的少量交换将一个字符串转换为另一个字符串。字符串保证可相互转换(它们具有相同的字符集,这是给定的),但字符可以重复。我在网上看到了关于同一个问题的结果,但没有重复这些字符。 字符串中的任意两个字符都可以交换

例如:“aabbccdd”可以在两次掉期中转换为“ddbbccaa”,而“abcc”可以在一次掉期中转换为“accb”

谢谢

在从一个字符串到另一个字符串的等效字符串图中进行A*搜索(有关说明,请参阅)。使用Levenshtein距离/2作为您的成本启发。

您可以构造“差异”字符串
S
S'
,即在两个字符串的不同位置包含字符的字符串,例如,对于
acbacb
abcabc
,它将是
cbcb
bcbc
。假设它包含n个字符

现在,您可以构造一个“置换图”G,它将具有
n
节点和一条从
i
j
的边,如果
S[i]==S'[j]
。在所有唯一字符的情况下,很容易看出所需的交换数将是(n-G中的循环数),这可以在O(n)时间内找到

然而,在存在任意数量重复字符的情况下,这就减少了在有向图中找出最大圈数的问题,我认为这是NP难的(例如,check out:)

在该文件中,指出了几个贪婪算法,其中一个特别简单:

  • 在每个步骤中,在图中找到最小长度循环(例如)
  • 删除它
  • 重复此操作,直到未覆盖所有顶点
  • 但是,可能会有一些有效的算法利用您案例的属性(我唯一能想到的是,您的图将是K部分的,其中K是
    S
    中唯一字符的数量)。祝你好运

    编辑:
    请参考David的答案,以获得对该问题更全面、正确的解释。

    这是的扩展和更正版本

    形式上,问题是,给定一个n字母的字母表V和两个m字母的单词x和y,其中存在一个置换p,使得p(x)=y,确定组成q满足q(x)=y的交换(固定除两个元素以外的所有元素的置换)的最少数量。假设n个字母的单词是从集合{1,…,m}到V的映射,并且p和q是{1,…,m}上的置换,动作p(x)被定义为组合p后跟x

    组成为p的掉期的最小数量可以用p的循环分解表示。当j1,…,jk在{1,…,m}中成对不同时,循环(j1…jk)是一种置换,它将{1,…,k-1}中的i的ji映射到ji+1,将jk映射到j1,并将其他每个元素映射到自身。置换p是每个不同循环(j p(j)p(p(j))…j')的组成,其中j是任意的且p(j')=j。组合顺序并不重要,因为每个元素恰好出现在一个组合循环中。k元素循环(j1…jk)可以写成乘积(j1 jk)(j1 jk-1)。。。(j1 j2)的k-1循环。一般来说,每个置换都可以写成m个交换的组合减去包含其循环分解的循环数。简单的归纳证明表明这是最优的

    现在我们进入了Subbasis答案的核心。asker问题的实例与欧拉有向图G一一对应(对于每个顶点,入度等于出度),其中顶点V和m弧标记为1,…,m。对于j in{1,…,n},标记为j的弧从y(j)到x(j)。关于G的问题是确定将G的弧划分为有向环的部分可以有多少部分。(因为G是欧拉的,这样的划分总是存在的。)这是因为置换q使得q(x)=y与划分一一对应,如下所示。对于q的每个循环(j1…jk),有一个零件的定向循环由标记为j1…jk的弧组成

    Subbasis的NP硬度降低的问题是,欧拉有向图上的弧不相交循环填充是一般有向图上弧不相交循环填充的特例,因此后者的NP硬度结果对前者的复杂性状态没有直接影响。然而,在(见下面的引文)中,事实证明,即使是欧拉特例也是NP难的。因此,通过上面的通信,提问者的问题也是如此

    正如Subbasis所提示的,当字母表的大小n固定(固定参数可处理)时,这个问题可以在多项式时间内解决。由于当弧未标记时存在O(n!)可分辨循环,我们可以在大小为O(mn)的状态空间上使用动态规划,即可分辨子图的数量。在实践中,对于(比如说)二进制字母表来说,这可能足够了,但如果我试图在具有大字母表的实例上精确地解决这个问题,那么我可能会尝试分支和定界,通过使用线性规划和列生成来分次打包循环,从而获得边界

    @article{DBLP:journals/corr/GutinJSW14,
      author    = {Gregory Gutin and
                   Mark Jones and
                   Bin Sheng and
                   Magnus Wahlstr{\"o}m},
      title     = {Parameterized Directed \$k\$-Chinese Postman Problem and \$k\$
                   Arc-Disjoint Cycles Problem on Euler Digraphs},
      journal   = {CoRR},
      volume    = {abs/1402.2137},
      year      = {2014},
      ee        = {http://arxiv.org/abs/1402.2137},
      bibsource = {DBLP, http://dblp.uni-trier.de}
    }
    

    我在这里可能大错特错,但最小交换数不是等于
    [(两个字符串之间的字符不匹配量)/2]
    ?在任何情况下,计算两个字符串之间的交换量都会得到交换量(因为在您的特定情况下,Levenshtein算法检测到的所有操作都是交换)@Renan:那这个
    abccab
    abcabc