问题理解 我们需要通过最多k次相邻字符交换操作,使得给定的由'0'和'1'组成的字符串的字典序最小。字典序最小意味着尽可能多的'0'在前面,'1'在后面。 解题思路 遍历字符串:从左到右遍历字符串,找到第一个'1'。 交换操作:尝试将这个'1'与前面的'0'交换,直到达到操作次数限制k。 更新字符串:在每次交换后,更新字符串并减少可用的操作次数k。 具体步骤 初始化: 将字符串转换为列表以便进行交换操作。 初始化一个变量k来记录剩余的交换次数。 遍历字符串: 从左到右遍历字符串,找到第一个'1'。 对于每个'1',尝试将其与前面的'0'交换。 交换操作: 从当前位置向前遍历,尝试将'1'与前面的'0'交换。 每次交换后,减少可用的交换次数k。 返回结果: 将列表转换回字符串并返回。 伪代码 plaintext function solution(n, k, s): # 将字符串转换为列表以便进行 交换操作 s_list = list(s) # 遍历字符串 for i from 0 to n-1: # 如果当前字符是'1',尝 试将其移到前面 if s_list[i] == '1': # 从当前位置向前遍 历,尝试将'1'与前 面的'0'交换 for j from i to 0: # 如果前面的字 符是'0'且还有 剩余的交换次数 if s_list [j] == '0' and k > 0: # 交换字 符 swap (s_list [i], s_list [j]) # 减少可 用的交换 次数 k -= 1 else: break # 将列表转换回字符串并返回 return ''.join(s_list)
关键点 遍历字符串:从左到右遍历字符串,找到第一个'1'。 交换操作:从当前位置向前遍历,尝试将'1'与前面的'0'交换,直到达到操作次数限制k。 更新字符串:每次交换后,更新字符串并减少可用的操作次数k 优化思路 记录最优交换位置: 在遍历字符串时,记录当前'1'可以交换到的最前面的'0'的位置。 这样可以避免不必要的交换操作。 优先交换最前面的'1': 在遍历字符串时,找到第一个'1',然后尝试将其与最前面的'0'进行交换。 优化后的代码 python def solution(n: int, k: int, s: str) -> str: # 将字符串转换为列表以便进行 交换操作 s_list = list(s) # 遍历字符串 for i in range(n): # 如果当前字符是'1',尝 试将其移到前面 if s_list[i] == '1': # 记录最优交换位置 best_swap_index = -1 # 从当前位置向前遍 历,找到最前面的 '0' for j in range (i, -1, -1): if s_list [j] == '0': best_swa p_index = j break # 如果找到了最前面 的'0'且还有剩余的 交换次数 if best_swap_index != -1 and k > 0: # 交换字符 s_list[i], s_list [best_swap_i ndex] = s_list [best_swap_i ndex], s_list[i] # 减少可用的交 换次数 k -= 1 # 将列表转换回字符串并返回 return ''.join(s_list)if name == 'main': print(solution(5, 2, "01010") == '00101') print(solution(7, 3, "1101001") == '0110101') print(solution(4, 1, "1001") == '0101')
关键点解释 记录最优交换位置: 在遍历字符串时,记录当前'1'可以交换到的最前面的'0'的位置。 这样可以避免不必要的交换操作。 优先交换最前面的'1': 在遍历字符串时,找到第一个'1',然后尝试将其与最前面的'0'进行交换。 通过这种方式,我们可以确保每次交换操作都能最大程度地减小字符串的字典序,从而减少交换操作的次数