1. 问题理解与解法思路
这道题目要求我们通过两种操作将给定的二进制字符串转换为交替字符串,并找出所需的最少反转次数。我们先明确几个关键概念:
交替字符串的定义是任意相邻字符都不相同,比如"0101"或"1010"。题目允许的两种操作:
- 类型1操作:将字符串的第一个字符移动到末尾
- 类型2操作:反转任意一个字符(0变1或1变0)
1.1 关键观察点
通过分析题目,我们可以得出几个重要结论:
-
操作顺序优化:类型2操作可以全部先执行,最后再执行类型1操作。因为类型1操作只是改变字符顺序,不影响字符值。
-
偶数长度情况:当字符串长度为偶数时,交替字符串只有两种可能形式:"0101..."或"1010..."。我们只需要计算将原字符串转换为这两种形式所需的最小反转次数。
-
奇数长度情况:当字符串长度为奇数时,情况稍复杂。交替字符串可能是"01010..."或"10101..."形式。此时可能需要一次类型1操作来拼接两个交替子串。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 动态规划解法详解
2.1 预处理数组定义
我们使用两个预处理数组来高效计算反转次数:
pre[i][j]:表示将前i个字符转换为以j结尾的交替字符串所需的最小反转次数suf[i][j]:表示将第i个字符到末尾转换为以j开头的交替字符串所需的最小反转次数
其中j可以是0或1。
2.2 递推关系建立
对于前缀数组pre:
code复制pre[i][0] = pre[i-1][1] + (s[i] != '0')
pre[i][1] = pre[i-1][0] + (s[i] != '1')
对于后缀数组suf:
code复制suf[i][0] = suf[i+1][1] + (s[i] != '0')
suf[i][1] = suf[i+1][0] + (s[i] != '1')
2.3 边界条件处理
- 初始条件:
pre[0][0] = (s[0] != '0')pre[0][1] = (s[0] != '1')suf[n-1][0] = (s[n-1] != '0')- `suf[n-1][1] = (s[n-1] != '1')
