在 Python 中查找使两个字符串相等所需的最小预处理移动次数
假设我们有两个相同长度的字符串 P 和 Q,它们只包含小写字母,我们需要计算在应用以下操作后使字符串 P 等于字符串 Q 所需的字符串 P 的最小预处理移动次数:
选择任何索引 i 并交换字符 pi 和 qi。
选择任何索引 i 并交换字符 pi 和 pn – i – 1。
选择任何索引 i 并交换字符 qi 和 qn – i – 1。
注意 - i 的值在范围 (0 ≤ i < n) 内
在一个移动中,我们可以将 P 中的一个字符更改为英语字母表中的任何其他字符。
因此,如果输入类似于 P = “pqprpqp”,Q = “qprpqpp”,则输出将为 4,因为如果我们将 P0 设置为 'q',P2 设置为 'r',P3 设置为 'p' 以及 P4 设置为 'q',则 P 将为“qqrpqqp”。之后,我们可以通过以下操作序列获得相等的字符串:交换(P1, Q1) 和交换(P1, P5)。
为了解决这个问题,我们将遵循以下步骤:
n := P 的大小
res := 0
对于 i 的范围从 0 到 n / 2,执行以下操作:
my_map := 一个新的映射
my_map[P[i]] := 1
如果 P[i] 与 P[n - i - 1] 相同,则
my_map[P[n - i - 1]] := my_map[P[n - i - 1]] + 1
如果 Q[i] 在 my_map 中,则
my_map[Q[i]] := my_map[Q[i]] + 1
否则,
my_map[Q[i]] := 1
如果 Q[n - i - 1] 在 my_map 中,则
my_map[Q[n - 1 - i]] := my_map[Q[n - 1 - i]] + 1
否则,
my_map[Q[n - 1 - i]] := 1
size := my_map 的大小
如果 size 与 4 相同,则
res := res + 2
否则,当 size 与 3 相同,则
res := res + 1 + (当 (P[i] 与 P[n - i - 1] 相同) 时为 1,否则为 0)
否则,当 size 与 2 相同,则
res := res + my_map[P[i]] 不与 2 相同
如果 n mod 2 与 1 相同,并且 P[n / 2] 不与 Q[n / 2] 相同,则
res := res + 1
返回 res
示例
让我们看看以下实现以更好地理解:
def count_preprocess(P, Q): n = len(P) res = 0 for i in range(n // 2): my_map = dict() my_map[P[i]] = 1 if P[i] == P[n - i - 1]: my_map[P[n - i - 1]] += 1 if Q[i] in my_map: my_map[Q[i]] += 1 else: my_map[Q[i]] = 1 if Q[n - i - 1] in my_map: my_map[Q[n - 1 - i]] += 1 else: my_map[Q[n - 1 - i]] = 1 size = len(my_map) if (size == 4): res += 2 elif (size == 3): res += 1 + (P[i] == P[n - i - 1]) elif (size == 2): res += my_map[P[i]] != 2 if (n % 2 == 1 and P[n // 2] != Q[n // 2]): res += 1 return res A = "pqprpqp" B = "qprpqpp" print(count_preprocess(A, B))
输入
"pqprpqp", "qprpqpp"
输出
4