使用Python查找将字符串变为一半单调需更新的次数

使用Python查找将字符串变为一半单调需更新的次数

假设我们有一个偶数长度的小写字符串s,我们必须找到需要更新的最小字符数,以便满足所有i的以下三个条件之一,其中0 ≤ i<n / 2并且j,n / 2 ≤ j<n−

  • s [i] > s [j]
  • s [i] < s [j]
  • s [i] s [j]

所以,如果输入为s =“pppxxp”,则输出为1,因为如果我们将最后一个“p”更改为“x”,那么这就可以满足条件s [i]

为了解决这个问题,我们将按照以下步骤进行 –

  • n:s的大小
  • left:包含s左半部分中每个字符频率的字典
  • right:包含s右半部分中每个字符频率的字典
  • ans:n
  • 对于小写英文字母中的每个字符枢轴,进行
    • ans:ans和(n-left [pivot] – right [pivot])的最小值
    • good:在(left [c]中存在的每个c)的所有元素的总和,如果c≤枢轴
    • good:good + 在(right [c]中存在的每个c)的所有元素的总和,如果c> pivot
    • ans:ans和(n-good)的最小值
    • good:在(left[c]中存在的每个c)的所有元素的总和,如果c> pivot
    • good:good + 在(right[c]中存在的每个c)的所有元素的总和,如果c≤枢轴
    • ans:ans和(n-good)的最小值
  • 返回ans

示例

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

from collections import Counter
from string import ascii_lowercase
def solve(s):
    n = len(s)
    left = Counter(s[: n >> 1])
    right = Counter(s[n >> 1 :])

    ans = n
    for pivot in ascii_lowercase:
        ans = min(ans, n - left[pivot] - right[pivot])

        good = sum(left[c] for c in left if c <= pivot)
        good += sum(right[c] for c in right if c > pivot)
        ans = min(ans, n - good)

        good = sum(left[c] for c in left if c > pivot)
        good += sum(right[c] for c in right if c <= pivot)
        ans = min(ans, n - good)

    return ans

s = "pppxxp"
print(solve(s))

输入

"pppxxp"

输出

1

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程