【牛客刷题】 计算01串通过相邻交换变成目标串的最大交换次数
文章目录
- 一、题目介绍
- 二、 核心思路分析
- 三、算法设计:如何计算交换次数?
-
- 3.1 :将所有 '1' 移到最左侧
- 3.2:将所有 '1' 移到最右侧
- 3.3 取最大值
- 3.4 为什么这个算法正确?
- 四、代码实现(Java)
-
- 4.1 代码实现
- 五、复杂度分析
- 六、总结
一、题目介绍
给定一个由 ‘0’ 和 ‘1’ 组成的字符串,每次操作可以交换相邻的两个字符。
问变换到所有可能的目标串中,所需交换次数最多是多少?
示例
输入:"01000"
输出:3
解释:
- 变换到
"00001"
需要 3 次交换(将中间的 ‘1’ 逐步右移 3 次) - 变换到
"10000"
需要 1 次交换
由于题目要求交换次数最多的目标串,故答案为 3。
二、 核心思路分析
-
关键观察:
所有交换次数最多的目标串,一定是所有 ‘1’ 完全聚集在最左侧或最右侧的形式(如111000
或000111
)。这是因为:- 若 ‘1’ 分散在中间,部分 ‘1’ 只需跨越少量 ‘0’ 即可到达目标位置。
- 而将所有 ‘1’ 移到极端位置时,每个 ‘1’ 必须跨越整个 ‘0’ 的序列,交换次数最大化。
-
问题转化:
计算两种极端情况的交换次数: