- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
当以下问题突然相关时,我正在浏览一个编程问题。
如何使用以下最少的交换将一个字符串转换为另一个字符串。字符串被保证可以相互转换(它们具有相同的字符集,这是给定的),,但是字符可以重复。我看到了关于同一问题的网络搜索结果,但没有重复字符。
字符串中的任何两个字符都可以交换。
例如:可以在两次交换中将“aabbccdd”转换为“ddbbccaa”,在一次交换中将“abcc”转换为“accb”。
谢谢!
最佳答案
这是Subhasis's answer的扩展和更正版本。
形式上,问题是,给定一个n字母的字母V和两个m字母的单词x和y,对于它们存在一个置换p,使得p(x)= y,确定交换的最少数量(固定的置换除两个元素之外的所有元素),其成分q满足q(x)= y。假设n个字母词是从集合{1,...,m}到V的映射,并且p和q是{1,...,m}的置换,则 Action p(x)定义为组成p,然后是x。
组成为p的掉期次数最少,可以用p的循环分解表示。当j1,...,jk在{1,...,m}中成对区分时,周期(j1 ... jk)是一个置换,它将{1,...,m}中i的ji映射到ji + 1。 ,k-1},将jk映射到j1,并将每个其他元素映射到自身。置换p是每个不同周期的组成(j p(j)p(p(j))... j'),其中j是任意的,p(j')= j。组成的顺序无关紧要,因为每个元素恰好出现在一个组成的循环中。 k个元素周期(j1 ... jk)可以写为k-1个周期的乘积(j1 jk)(j1 jk-1)...(j1 j2)。通常,每个置换可以写为m个交换的组成减去组成其周期分解的周期数。直接的归纳证明表明这是最佳的。
现在,我们深入了解Subhasis的答案。 提问者问题的实例与欧拉(对于每个顶点,度数等于度数)的二阶图G对应,顶点V和m的圆弧分别标记为1,...,m。对于{1,...,n}中的j,标记为j的弧从y(j)到x(j)。就G而言,问题在于确定将G的弧划分成有向循环的部分可以具有多少部分。 (由于G是欧拉矩阵,所以总是存在这样的分区。)这是因为如下所述,使得q(x)= y的排列q与这些分区一一对应。对于q的每个周期(j1 ... jk),存在一个部分,其定向周期由标为j1,...,jk的弧组成。
与Subhasis的NP硬度降低有关的问题是,欧拉图上的弧不相交循环堆积是普通图上的弧不相交循环堆积的特殊情况,因此后者的NP硬度结果对复杂度没有直接影响。前者的地位。但是,在very recent work中(请参见下面的引文),事实证明,即使是欧拉特例,也是NP-hard的。因此,通过上述对应关系,提问者的问题也同样存在。
正如Subhasis所暗示的,当字母的大小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}
}
关于string - 寻找将一个字符串转换为另一字符串的最小交换次数,其中字符串可能包含重复的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18292202/
如何使用 SPListCollection.Add(String, String, String, String, Int32, String, SPListTemplate.QuickLaunchO
我刚刚开始使用 C++ 并且对 C# 有一些经验,所以我有一些一般的编程经验。然而,似乎我马上就被击落了。我试过在谷歌上寻找,以免浪费任何人的时间,但没有结果。 int main(int argc,
这个问题已经有答案了: In Java 8 how do I transform a Map to another Map using a lambda? (8 个回答) Convert a Map>
我正在使用 node + typescript 和集成的 swagger 进行 API 调用。我 Swagger 提出以下要求 http://localhost:3033/employees/sear
我是 C++ 容器模板的新手。我收集了一些记录。每条记录都有一个唯一的名称,以及一个字段/值对列表。将按名称访问记录。字段/值对的顺序很重要。因此我设计如下: typedef string
我需要这两种方法,但j2me没有,我找到了一个replaceall();但这是 replaceall(string,string,string); 第二个方法是SringBuffer但在j2me中它没
If string is an alias of String in the .net framework为什么会发生这种情况,我应该如何解释它: type JustAString = string
我有两个列表(或字符串):一个大,另一个小。 我想检查较大的(A)是否包含小的(B)。 我的期望如下: 案例 1. B 是 A 的子集 A = [1,2,3] B = [1,2] contains(A
我有一个似乎无法解决的小问题。 这里...我有一个像这样创建的输入... var input = $(''); 如果我这样做......一切都很好 $(this).append(input); 如果我
我有以下代码片段 string[] lines = objects.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.No
这可能真的很简单,但我已经坚持了一段时间了。 我正在尝试输出一个字符串,然后输出一个带有两位小数的 double ,后跟另一个字符串,这是我的代码。 System.out.printf("成本:%.2
以下是 Cloud Firestore 列表查询中的示例之一 citiesRef.where("state", ">=", "CA").where("state", "= 字符串,我们在Stack O
我正在尝试检查一个字符串是否包含在另一个字符串中。后面的代码非常简单。我怎样才能在 jquery 中做到这一点? function deleteRow(locName, locID) { if
这个问题在这里已经有了答案: How to implement big int in C++ (14 个答案) 关闭 9 年前。 我有 2 个字符串,都只包含数字。这些数字大于 uint64_t 的
我有一个带有自定义转换器的 Dozer 映射: com.xyz.Customer com.xyz.CustomerDAO customerName
这个问题在这里已经有了答案: How do I compare strings in Java? (23 个回答) 关闭 6 年前。 我想了解字符串池的工作原理以及一个字符串等于另一个字符串的规则是
我已阅读 this问题和其他一些问题。但它们与我的问题有些无关 对于 UILabel 如果你不指定 ? 或 ! 你会得到这样的错误: @IBOutlet property has non-option
这两种方法中哪一种在理论上更快,为什么? (指向字符串的指针必须是常量。) destination[count] 和 *destination++ 之间的确切区别是什么? destination[co
This question already has answers here: Closed 11 years ago. Possible Duplicates: Is String.Format a
我有一个Stream一个文件的,现在我想将相同的单词组合成 Map这很重要,这个词在 Stream 中出现的频率. 我知道我必须使用 collect(Collectors.groupingBy(..)
我是一名优秀的程序员,十分优秀!