Python程序:找出修复方程所需的更正次数


假设我们有一个字符串 s,它表示一个形如 x+y=z 的方程。我们需要找到需要添加到 s 中的最小数字位数,以便该方程成立。

因此,如果输入类似于 s = '2+6=7',则输出将为 2。

我们可以通过插入“1”和“2”将方程转换为“21+6=27”。因此,所需的更正总数为 2。

为了解决这个问题,我们将遵循以下步骤:

  • 根据“+”字符将 s 分割成部分,将左部分放入 A,将右部分放入 rest

  • 根据“=”字符将 rest 分割成部分,将左部分放入 B,将右部分放入 C

  • 返回 dp(A 的大小 - 1, B 的大小 - 1, C 的大小 - 1, 0)

  • 定义一个函数 dp()。它将接收 i、j、k、carry 作为参数

  • 如果 i <= -1 且 j <= -1 且 k <= -1,则

    • 如果 carry 等于 0,则返回 0,否则返回 1

  • last1 := 如果 i >= 0,则 (A[i]),否则为 0

  • last2 := 如果 j >= 0,则 (B[j]),否则为 0

  • last3 := 如果 k >= 0,则 (C[k]),否则为 0

  • prefix1 := 如果 i >= 0,则 (A[从索引 0 到 i + 1]),否则为 0

  • prefix2 := 如果 j >= 0,则 (B[从索引 0 到 j + 1]),否则为 0

  • prefix3 := 如果 k >= 0,则 (C[从索引 0 到 k + 1]),否则为 0

  • 如果 i <= -1 且 j <= -1,则

    • rhs := prefix3 - carry

    • 如果 rhs <= 0,则

      • 返回 |rhs|

    • 如果 i 等于 -1 或 j 等于 -1,则

      • 返回字符串 rhs 的大小

    • 否则,

      • 返回 False

    • 如果 k <= -1,则

      • 返回 str(prefix1 + prefix2 + carry) 的大小

    • ans := 无限大

    • carry2、lhs := 返回将 (carry + last1 + last2) 除以 10 得到的商和余数

    • 如果 lhs 等于 last3,则

      • ans := dp(i - 1, j - 1, k - 1, carry2)

    • req := last3 - carry - last2

    • extra_zeros := 0 和 -1 - i 的最大值

    • 如果 req < 0,则 carry2 := 1,否则为 0

    • ans := ans 和 1 + extra_zeros + dp(-1、i、j - 1、k - 1、carry2 的最大值) 的最小值

    • req := last3 - carry - last1

    • extra_zeros := 0 和 -1 - j 的最大值

    • 如果 req < 0,则 carry2 := 1,否则为 0

    • ans = ans 和 1 + extra_zeros + dp(i - 1, -1 和 j 的最大值, k - 1, carry2) 的最小值

    • carry2、lhs := 返回将 (last1 + last2 + carry) 除以 10 得到的商和余数

    • ans := ans 和 1 + dp(i - 1, j - 1, k, carry2) 的最小值

    • 返回 ans

  • 从主方法返回 dp(A 的大小 – 1, B 的大小 – 1, C 的大小 – 1, 0)

示例

让我们看看下面的实现,以便更好地理解:

实时演示

class Solution:
   def solve(self, s):
      A, rest = s.split("+")
      B, C = rest.split("=")
      def dp(i, j, k, carry):
         if i <= -1 and j <= -1 and k <= -1:
            return 0 if carry == 0 else 1
         last1 = int(A[i]) if i >= 0 else 0
         last2 = int(B[j]) if j >= 0 else 0
         last3 = int(C[k]) if k >= 0 else 0
         prefix1 = int(A[: i + 1]) if i >= 0 else 0
         prefix2 = int(B[: j + 1]) if j >= 0 else 0
         prefix3 = int(C[: k + 1]) if k >= 0 else 0
         if i <= -1 and j <= -1:
            rhs = prefix3 - carry
            if rhs <= 0:
               return abs(rhs)
            if i == -1 or j == -1:
               return len(str(rhs))
            else:
               assert False
         if k <= -1:
            return len(str(prefix1 + prefix2 + carry))
         ans = float("inf")
         carry2, lhs = divmod(carry + last1 + last2, 10)
         if lhs == last3:
            ans = dp(i - 1, j - 1, k - 1, carry2)
         req = last3 - carry - last2
         extra_zeros = max(0, -1 - i)
         carry2 = 1 if req < 0 else 0
         ans = min(ans, 1 + extra_zeros + dp(max(-1, i), j - 1, k - 1, carry2))
         req = last3 - carry - last1
         extra_zeros = max(0, -1 - j)
         carry2 = 1 if req < 0 else 0
         ans = min(ans, 1 + extra_zeros + dp(i - 1, max(-1, j), k - 1, carry2))
         carry2, lhs = divmod(last1 + last2 + carry, 10)
         ans = min(ans, 1 + dp(i - 1, j - 1, k, carry2))
         return ans
      return dp(len(A) - 1, len(B) - 1, len(C) - 1, 0)

ob = Solution()
print (ob.solve('2+6=7'))

输入

'2+6=7'

输出

2

更新于: 2020-12-23

152 次浏览

开启你的 职业生涯

通过完成课程获得认证

立即开始
广告