Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.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
Python 查找排序字符串所需的最小字母交换量_Python_Sorting - Fatal编程技术网

Python 查找排序字符串所需的最小字母交换量

Python 查找排序字符串所需的最小字母交换量,python,sorting,Python,Sorting,我有一个问题,我需要找到排序字符串所需的最小字母交换量。每次移动时,我可以交换两个字符的位置(不一定相邻),我需要找到最小交换量 我以前在二进制中解决过类似的问题(要求位交换相邻)。因此,排序101010=>000111将返回6,但无法找到概括我的解决方案的方法: def sort(s): ones = 0 res = 0 for b in s: if b == "1": ones += 1 if

我有一个问题,我需要找到排序字符串所需的最小字母交换量。每次移动时,我可以交换两个字符的位置(不一定相邻),我需要找到最小交换量

我以前在二进制中解决过类似的问题(要求位交换相邻)。因此,排序
101010=>000111
将返回
6
,但无法找到概括我的解决方案的方法:

def sort(s):
    ones = 0
    res = 0
    for b in s:
        if b == "1":
            ones += 1
        if b == "0":
            res += ones
    return res

我是否应该在这里合并
ord()
函数来改变问题,改为处理整数?如有任何提示,我们将不胜感激。

最小互换数量取决于字母的排列顺序。例如,假设单词是
“wonderful”
,那么排序顺序是
“deflnoruw”
,循环是

  • w→ d
    d→ l
    l→ w
  • o→ e
    e→ n
    n→ f
    f→ r
    r→ o
  • u→ u
循环的长度分别为3、5和1,因此我们从每个长度中减去1,以获得执行这些循环所需的最小交换次数:2+4+0=6次交换。等价地,交换数是字符串长度减去循环数:9-3=6


因此,您的算法将需要按照这个想法工作;这可能有助于调查发现实际进行排序的周期的方法。还要注意的是,当单词有重复的字母时,它比上面的例子要复杂一些。

请尝试下面的程序。这将通过尝试从
0
n-1
唯一交换来检查最小交换数,以获得长度为
n
的字符串
我用很少的字符串测试了它

input=list(“CAB”)
输出=列表(“AABBCC”)
def get_映射(输出、输入):
#创建输出到输入的映射,删除现有匹配项
map={}
对于zip中的i,j(输出,输入):
如果我=j:
如果我在地图上:
映射[i].追加(j)
其他:
map[i]=[j]
返回图
def get_链(映射、字符、查找、交换):
#创建元素链

如果我对问题的定义感到困惑。对于您发布的代码,
sort('101010')==6
not
000111
。您并没有真正排序或交换任何东西。Res是交换的最小数量。@Tomerikoo上述代码仅限于交换相邻位。编辑了问题。这可能很方便:
Number of swaps: 2