Python 中使一组条件下满足条件所需的最小字符数的程序

Python 中使一组条件下满足条件所需的最小字符数的程序

假设我们有两个仅包含小写字母的字符串 s 和 t。在一次操作中,我们可以将 s 或 t 中的任何字符更改为任何小写字母。我们必须满足以下三个条件之一:

  • s 中的每个字母在字母表中都严格小于 t 中的每个字母。

  • t 中的每个字母在字母表中都严格小于 s 中的每个字母。

  • s 和 t 都只由一个不同的字母组成。

我们必须找到获得结果所需的最小操作数。

例如,如果输入为 s =“sts”,t =“uss”,则输出将是2,因为:

  • 如果我们在 2 个操作中将 t 更改为“uuu”,则 s 中的每个字母都小于 t 中的每个字母。

  • 如果我们在 3 个操作中将 s 更改为“ttt”并将 t 更改为“sss”,则 t 中的每个字母都小于 s 中的每个字母。

  • 如果我们在 2 个操作中将 s 更改为“sss”并将 t 更改为“sss”,则 s 和 t 都只由一个不同的字母组成。

此处最佳操作是在 2 个操作中完成的(要么是 1,要么是 3)。

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

  • 计数器 s :用于保存 s 中每个字符的频率的映射
  • 计数器 t :用于保存 t 中每个字符的频率的映射
  • less_s :无穷大 less_t :无穷大一边独特的:无穷大偏见 s :0 偏见 t :0
  • 对于小写的英文字母中的每个字符 c,执行以下操作:
    • 独特的:最小化独特性并减小(s 的大小加上 t 的大小减去 counter_s [ c ] – counter_t [ c ])
      • counter_t [ c ]
    • 如果 c 的 ASCII 大于 ‘a’ 的 ASCII,则
      • less_a := min(less_s ,s 的大小 – accu_s + accu_t)
      • less_b := min(less_t ,t 的大小 – accu_t + accu_s)
    • accu_s := accu_s + counter_s [ c ]
    • accu_t := accu_t + counter_t [ c ]
  • 返回 less_s、less_t 和 unique 的最小值

实例

让我们看以下实现以获得更好的理解。

from collections import Counter
import string
def solve(s, t):
   counter_s = Counter(s)
   counter_t = Counter(t)
   less_s, less_t, unique = float('inf'), float('inf'), float('inf')
   accu_s, accu_t = 0, 0
   for c in string.ascii_lowercase:
      unique = min(unique, len(s) + len(t) - counter_s[c] - counter_t[c])
      if c > 'a':
       less_a = min(less_s, len(s) - accu_s + accu_t)
         less_b = min(less_t, len(t) - accu_t + accu_s)
      accu_s += counter_s[c]
      accu_t += counter_t[c]
   return min(less_s, less_t, unique)

s = "sts"
t = "uss"
print(solve(s, t))

输入

"sts","uss"

输出

2

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程