查找Python中有损运行长度编码的最小长度的程序

假设我们有一个小写的字符串s和另一个值k。现在考虑一个操作,在该操作中,我们通过将重复的连续字符作为计数和字符对字符串执行行程编码。因此,如果字符串像“ aaabbc”,则将被编码为“ 3a2bc”。这里我们不将“ 1c”替换为“ c”,因为它仅连续出现一次。因此,我们可以先删除s中的任何k个连续字符,然后找到结果游程长度编码的最小可能长度。

因此,如果输入像s =“ xxxxxyyxxxxxzzxxx”,k = 2,则输出将为6,因为两个明显的选择是删除“ yy”或“ zz”。如果删除“ yy”,则将得到长度为7的“ 10x2z3x”。如果删除“ zz”,则将得到长度为6的“ 5x2y8x”,这是最小的。

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

  • 定义一个函数calc_cost()。这需要l

  • 如果l等于0,则

    • 返回0

  • 如果l与1相同

    • 返回1

  • 除此以外,

    • str(l)+ 1的返回大小

  • 定义一个功能prefix()。这将花费

    • 如果c与最后一个相同,则

    • 除此以外,

    • 最后:= c

    • 在pre中插入一个对(pre的最后一项的第0个元素,1 + pre的最后一项的第1元素)

    • 将(pre的最后一项的第0个元素)+ calc_cost(pre的最后一项的第1元素,1)插入pre

    • pre:=最初带有对[0,0]的列表

    • 最后:= null

    • 对于s中的每个c

    • 返回预

    • 从主要方法执行以下操作:

    • pre:=前缀

    • suf:=前缀的反向(以相反的顺序)

    • ans:=无限

    • 对于范围0到s-k + 1的i

      • 成本:=成本+ calc_cost(midl)+ calc_cost(midr)

      • 成本:=成本+ calc_cost(midl + midr)

      • j:= i + k

      • 对(左,中):= pre [i]

      • 对(右,中):= suf [j]

      • 费用:=左+右

      • c1:= s [i-1]如果i> 0否则为null

      • c2:= s [j]如果j <s的大小,否则为null

      • 如果c1与c2相同,则

      • 除此以外,

      • ans:= ans和cost的最小值

      • 返回ans

      让我们看下面的实现以更好地理解-

      示例

      def calc_cost(l):
         if l == 0:
            return 0
         if l == 1:
            return 1
         else:
            return len(str(l)) + 1
      class Solution:
         def solve(self, s, k):
            def prefix(s):
               pre = [[0, 0]]
               last = None
               for c in s:
                  if c == last:
                     pre.append([pre[-1][0], pre[-1][1] + 1])
                  else:
                     pre.append([pre[-1][0] + calc_cost(pre[-1][1]),1])
                  last = c
               return pre
            pre = prefix(s)
            suf = prefix(s[::-1])[::-1]
            ans = float("inf")
            for i in range(len(s) - k + 1):
               j = i + k
               left, midl = pre[i]
               right, midr = suf[j]
               cost = left + right
               c1 = s[i - 1] if i > 0 else None
               c2 = s[j] if j < len(s) else None
               if c1 == c2:
                  cost += calc_cost(midl + midr)
               else:
                  cost += calc_cost(midl) + calc_cost(midr)
               ans = min(ans, cost)
               return ans
      ob = Solution()s = "xxxxxyyxxxxxzzxxx"
      print(ob.solve(s, 2))

      输入值

      s = "xxxxxyyxxxxxzzxxx"

      输出结果

      6
      猜你喜欢