青训营刷题讲解 | 豆包MarsCode AI刷题

65 阅读3分钟

题目为:最小成本生成二进制字符串,具体描述如下: 小R拥有一个长度为 N 的二进制字符串 S,其中每个字符要么是 0,要么是 1,编号从 0 到 N-1。现在他想构造一个新的字符串 T,并且可以通过以下两种操作生成 T

  1. 推送操作:你可以将一个字符 0 或 1(如果 T 为空),或者将等于 T 最后一个字符的字符推送到 T 的末尾。这个操作的成本为 0
  2. 反转操作:你可以将 T 的最后一个字符进行反转,即如果最后一个字符是 1,则将其变为 0,如果是 0,则将其变为 1。这个操作的成本为 1。 你的任务是确定,最少需要多少成本才能使字符串 T 等于给定的字符串 S。 例如:当 N = 2S = "10" 时,可以按如下操作生成字符串 T
  • 首先,推送 1(成本为 0),T = "1"
  • 然后,推送 1(成本为 0),T = "11"
  • 最后,反转最后一个字符 1 为 0(成本为 1),T = "10"。 因此,最小总成本为 1。 我对这题的理解:
  • 推送操作允许我们免费地增加与当前字符串T最后字符相同的字符或在T为空时添加0/1。
    • 反转操作允许我们改变T的最后一个字符,但需要支付成本1。
  • 用策略思考:
    • 如果S的第一个字符是0或1,那么我们可以通过推送操作开始构建T而无需任何成本。
    • 对于S中的每个后续字符,如果它与前一个字符相同,则继续使用推送操作(成本为0);如果不同,则必须使用一次反转操作(成本为1),因为直接推送无法改变现有字符。 解决: 从第二个字符开始遍历S,比较当前字符与前一字符。每当遇到不同时,就记录一次成本。 最终累加所有由于不同而导致的反转次数即为我们所需的最小成本。 特殊情况处理: 1,当S全由相同的字符组成时(如"111"或"000"),不需要进行任何反转操作,因此总成本为0。 2,字符串长度为1的情况,直接返回0作为成本,因为无需任何操作即可满足条件。 我的学习心得: 这个问题很好地展示了如何通过观察模式来简化复杂性。一开始可能觉得需要考虑很多情况,但实际上只需要关注相邻字符间的变化。 它也强调了算法设计中“贪心”思想的应用——总是选择当前最优解(这里是指尽可能少地使用高成本的操作)来达到全局最优。 此外,这类问题有助于训练逻辑思维能力和编程技巧,特别是如何高效地实现算法并处理边界条件。