在 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