將字串轉換為另一個字串所需的最小運算元
給定兩個字串 A 和 B,任務是將字串 A 轉換為字串 B(如果可能)。你只能執行一種操作,即從 A 中取出任何字元並將其插入到開頭。檢查是否可以轉換字串。如果是,則輸出轉換所需的最小運算元。
輸入輸出場景
假設我們有兩個字串 A 和 B,其值分別為“ABD”和“BAD”,將第一個字串轉換為第二個字串所需的操作是 1,即交換前兩個字元。
輸入
A = "ABD", B = "BAD"
輸出
1
考慮另一個場景
輸入
A = "EACBD", B = "EABCD"
輸出
3
將 A 轉換為 B 所需的操作是:
取 B 並放在前面,EACBD => BEACD
取 A 並放在前面,BEACD => ABECD
取 E 並放在前面,ABECD => EABCD
Python 實現
以下是 Python 實現
示例
def transformString(A, B): if len(A) != len(B): return -1 count = 0 i = len(A) - 1 j = len(B) - 1 while i >= 0 and j >= 0: if A[i] == B[j]: i -= 1 j -= 1 else: count += 1 i -= 1 return count A = "Hello Welcome to Tutorialspoint " B = "Tutorialspoint simply easy learning" print("Operations Required: ", transformString(A, B)) A = "EACBD" B = "EABCD" print("Operations Required: ", transformString(A, B))
輸出
Operations Required: 35 Operations Required: 3
方法
讓我們透過除錯上述程式來了解所採用的方法。
該函式首先確定 A 和 B 的長度是否相等。如果長度不相等,則函式返回 -1,因為無法透過在開頭新增字母來將 A 更改為 B。
當 A 和 B 都具有相同的長度時,函式初始化兩個指標 i 和 j,它們分別指向 A 和 B 的末尾,以及一個變數 count 為 0。
之後,函式開始一個 while 迴圈,只要 i 和 j 都非負,該迴圈就會繼續執行。
在 while 迴圈內,函式檢查 A[i] 處的字元是否等於 B[j] 處的字元。如果它們相等,則函式將 i 和 j 都遞減 1,有效地跳過這些字元。
如果字元不相等,則函式將 count 遞增 1 並將 i 遞減 1,有效地將 A[i] 處的字元“插入”到 A 的開頭。
然後,函式確定 while 迴圈終止後 j 是否為負。如果是,則 B 中的所有字元都已與其在 A 中的等效項匹配,並且 count 的值反映了將 A 更改為 B 所需的最小插入次數。函式返回 count。
如果 j 不是負數,則無法透過在前面新增字元來將 A 更改為 B,因為 B 仍然包含未匹配的字元。當轉換不可能時,函式返回 -1。
Java 實現
以上程式碼的 Java 實現
示例
import java.util.*; public class Demo{ public static int transformString(String A, String B) { if (A.length() != B.length()) { return -1; } int count = 0; int i = A.length() - 1; int j = B.length() - 1; while (i >= 0 && j >= 0) { if (A.charAt(i) == B.charAt(j)) { i--; j--; } else { count++; i--; } } return count; } public static void main(String[] args) { String A = "Hello Welcome to Tutorialspoint "; String B = "Tutorialspoint simply easy learning"; int result = transformString(A, B); System.out.println("Minimum number of operations required: " + result); A = "EACBD"; B = "EABCD"; result = transformString(A, B); System.out.println("Minimum number of operations required: " + result); } }
輸出
Minimum number of operations required: 35 Minimum number of operations required: 3
時間和空間複雜度
transform 函式的時間複雜度為 **O(n)**,其中 n 是輸入字串 A 和 B 的長度。這是因為該函式使用兩個指標 i 和 j 從末尾到開頭遍歷字串的字元,以定期比較字元並遞增或遞減指標和計數器。因此,時間複雜度與字串的長度成正比。
transform 函式的空間複雜度為 **O(1)**,這意味著它需要的額外記憶體量與輸入字串的長度無關。該函式不建立任何額外的資料結構或動態分配記憶體;它只需要固定數量的記憶體來儲存變數 count、i 和 j。