字典序最小的01字符串|豆包MarsCode AI 刷题

66 阅读3分钟

字典序最小的01字符串

问题理解

  1. 字典序最小:字符串的字典序最小意味着我们需要尽可能地将 0 放在前面,1 放在后面。
  2. 相邻字符交换:每次操作只能交换相邻的两个字符,这意味着我们需要逐步将 0 向左移动,1 向右移动。

数据结构选择

  • 我们可以使用一个列表来存储字符串的字符,以便于进行相邻字符的交换操作。

算法步骤

  1. 初始化:将字符串转换为列表,以便进行交换操作。
  2. 遍历字符串:从左到右遍历字符串,尝试将当前位置的 0 尽可能地向左移动。
  3. 交换操作:对于每个 0,计算它需要移动的步数(即它前面有多少个 1),如果步数小于等于 k,则进行交换,并更新 k 的值。
  4. 终止条件:当 k 不足以进行任何进一步的交换时,停止操作。
  5. 结果转换:将最终的列表转换回字符串并返回。

关键点

  • 贪心策略:每次尽量将当前的 0 向左移动到最远的位置,直到 k 用完为止。
  • 边界情况:考虑 k 为 0 的情况,以及字符串中没有 0 或没有 1 的情况。

代码解析

  1. 函数签名

    def solution(n: int, k: int, s: str) -> str:
    

    这个函数签名是正确的,接收三个参数:字符串的长度 n,最大操作次数 k,以及字符串 s。返回值是一个字符串。

  2. 函数体

    # write code here
    return ""
    

    目前函数体是空的,你需要在这里实现具体的逻辑。

  3. 测试用例

    if __name__ == '__main__':
        print(solution(5, 2, "01010") == '00101')
        print(solution(7, 3, "1101001") == '0110101')
        print(solution(4, 1, "1001") == '0101')
    

    这些测试用例是正确的,用来验证你的 solution 函数是否能正确解决问题。

建议

  1. 理解题目: 你需要通过最多 k 次相邻字符交换操作,使得字符串 s 的字典序最小。

  2. 解题思路

    • 遍历字符串 s,找到字典序最小的字符。
    • 通过交换操作,将这个字符尽可能地移动到字符串的前面。
    • 重复上述步骤,直到用完所有的操作次数 k 或者字符串已经达到最小字典序。
  3. 实现步骤

    • 使用一个循环来遍历字符串 s
    • 在每次循环中,找到当前未处理部分的最小字符。
    • 通过交换操作将这个字符移动到当前位置。
    • 更新剩余的操作次数 k

代码框架

def solution(n: int, k: int, s: str) -> str:
    # 将字符串转换为列表,方便进行交换操作
    s = list(s)
    
    # 遍历字符串
    for i in range(n):
        # 找到当前未处理部分的最小字符
        min_index = i
        for j in range(i + 1, n):
            if s[j] < s[min_index]:
                min_index = j
        
        # 计算需要交换的次数
        swaps_needed = min_index - i
        
        # 如果需要的交换次数小于等于剩余的操作次数,则进行交换
        if swaps_needed <= k:
            # 将最小字符移动到当前位置
            while min_index > i:
                s[min_index], s[min_index - 1] = s[min_index - 1], s[min_index]
                min_index -= 1
            # 更新剩余的操作次数
            k -= swaps_needed
        else:
            # 如果剩余操作次数不够,则停止操作
            break
    
    # 将列表转换回字符串并返回
    return ''.join(s)

需要在 solution 函数中实现具体的逻辑来解决题目中的问题。你可以使用贪心算法来逐步将最小的字符移动到字符串的前面,直到用完所有的操作次数 k