假设我们有两个字符串 s 和 t,我们必须检查是否可以在 k 次或更少的移动中将 s 转换为 t。在第 i 步中,您可以执行这些操作。
选择 s 中的任何索引 j(从 1 开始),使得 1 <= j <= s 和 j 的大小在之前的任何移动中都没有被选择,并在该索引处移动字符 i 次。
保持原样。
这里移动一个字符意味着用字母表中的下一个字母替换它(如果字母是 'z',则将其换行为 'a')。因此,将字符移位 i 次表示应用移位操作 i 次。
因此,如果输入类似于 s = "poput" t = "vwput" k = 9,那么输出将为 True,因为在 i = 6 时,我们可以将 'p' 转换为 'v',而在 i = 8 时,我们可以将“o”转换为“w”。
为了解决这个问题,我们将按照以下步骤操作:
如果 s 的大小与 t 的大小不同,则
返回错误
count := 一个数组(最小值为 1 和 (k - i + 1 +(k - i)/26)),用于从 0 到 25 的所有 i
对于来自 s 的每个字符 c1 和来自 t 的 c2,做
diff :=(c2 的 ASCII - c1 + 26 的 ASCII) mod 26
如果 count[diff] <= 0,则
计数[差异] := 计数[差异] - 1
返回错误
如果 c1 与 c2 不同,则
返回真
让我们看看下面的实现来更好地理解
def solve(s, t, k): if len(s) != len(t): return False count = [min(1, k - i + 1) + (k - i)//26 for i in range(26)] for c1, c2 in zip(s, t): if (c1 != c2): diff = (ord(c2) - ord(c1) + 26) % 26 if count[diff] <= 0: return False count[diff] -= 1 return True s = "poput" t = "vwput" k = 9 print(solve(s, t,k))
"poput","vwput",9输出结果
True