Python程序:平衡方向字符串,使每个方向出现的次数均为四分之一
假设我们有一个字符串s,其中包含四个方向:"N"、"S"、"W"和"E",分别代表北、南、西和东。我们需要找到可以更新的最小子字符串的大小,以便这四个方向分别出现n/4次,其中n是字符串s的大小。
例如,如果输入是s = "NNSWWESN",则输出为1。这里n是8,所以8/4是2。如果我们将最后一个N改为E,则所有方向都将出现两次。
为了解决这个问题,我们将遵循以下步骤:
- n := s的长度
- 如果n为0,则
- 返回0
- quarter := floor(n / 4)
- count := 包含s中每个元素频率的列表
- target := 一个新的映射
- 对于count中的每个(dir, cnt)对,执行:
- 如果cnt > quarter,则
- target[dir] := quarter - cnt
- 如果cnt > quarter,则
- 如果target为空,则
- 返回0
- left := 0
- min_len := inf
- 对于s中的每个索引right和方向dir,执行:
- 如果dir在target中,则
- target[dir] := target[dir] + 1
- 当target所有值的最小值 >= 0时,执行:
- min_len := min(min_len, (right - left + 1))
- 如果s[left]在target中,则
- target[s[left]] := target[s[left]] - 1
- left := left + 1
- 如果dir在target中,则
- 返回min_len
示例
让我们看下面的实现来更好地理解:
from collections import Counter def solve(s): n = len(s) if not n: return 0 quarter = n // 4 count = Counter(s) target = dict() for (dir, cnt) in count.items(): if cnt > quarter: target[dir] = quarter - cnt if not target: return 0 left, min_len = 0, float("inf") for right, dir in enumerate(s): if dir in target: target[dir] += 1 while min(target.values()) >= 0: min_len = min(min_len, right - left + 1) if s[left] in target: target[s[left]] -= 1 left += 1 return min_len s = "NNSWWESN" print(solve(s))
输入
"NNSWWESN"
输出
1
广告