python - 找到排序字符串所需的最小字母交换量
问题描述
我有一个问题,我需要找到对字符串进行排序所需的最少字母交换量。每次移动,我都可以交换两个字符的位置(不一定相邻),我需要找到最小的交换量。
我以前用二进制解决了一个类似的问题(需要位交换相邻)。所以排序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。
所以,你的算法需要按照这个想法工作;它可能有助于研究循环排序算法,该算法找到实际进行排序的循环。另请注意,当单词有重复字母时,它比上面的示例要复杂一些。
推荐阅读
- swift - 使用关系的 CoreData 谓词
- mongodb - 根据条件排除嵌套文档
- tensorflow - tensorflow 中的简单 LSTM 实现:考虑将元素转换为支持的类型错误
- html - 选框标签从上到下的语法是什么?
- node.js - 如何使用 json 数据获取 API 发布请求
- xml - 为什么外部 DTD 不验证 XML 文件?
- vb.net - 创建窗口句柄时出错。控件未正确处理导致内存堆积和崩溃
- c - 捕获 C 函数参数名称
- watchkit - 通过使用 URL 请求获取数据来更新 Apple Watch 复杂功能
- python - 刚开始学习 django - 我在 VS Code 中得到“未定义的变量 'auth'”,并且在服务器上出现另一个错误