題目地址:
https://leetcode.com/problems/one-edit-distance/
給定兩個字符串和,問可否由下列三種變換變爲:
1、在中插入一個字符;
2、在中刪除一個字符;
3、在中替換一個字符。
如果可以就返回true,否則返回false。
首先排除掉與長度差大於等於或者和相等的情況,這兩種情況下都是不可能變爲的,直接返回false。
接着,從左向右同時掃描和,如果遇到相同字符,那就繼續掃描,否則,如果遇到不同字符,那麼必然要經過三種變換其中的一種,來”修復“這種不同,而用哪一種變換取決於和的長度的比較。如果和一樣長,那就是變換,如果比長,那就是變換,如果比短,那就是變換;無論哪一種,都只需要繼續比較和的剩餘子串就可以了。代碼如下:
public class Solution {
public boolean isOneEditDistance(String s, String t) {
// 如果兩個字符串長度之差大於等於2,或者兩個字符串相等,
// 那s絕對無法通過一次變換變爲t,直接返回false
if (Math.abs(s.length() - t.length()) >= 2 || s.equals(t)) {
return false;
}
int i = 0, j = 0;
while (i < s.length() && j < t.length() && s.charAt(i) == t.charAt(j)) {
i++;
j++;
}
if (s.length() < t.length()) {
return s.substring(i).equals(t.substring(j + 1));
} else if (s.length() > t.length()) {
return s.substring(i + 1).equals(t.substring(j));
} else {
return s.substring(i + 1).equals(t.substring(j + 1));
}
}
}
時間複雜度,空間。
算法正確性證明:
首先如果兩個字符串長度大於或者兩個字符串相等的時候,返回false,這一點沒有問題。
接下來,當while循環退出時,有三種可能性,
1、已經走到頭;
2、已經走到頭;
3、。
如果的長度小於的話,那麼要麼要麼,並且的長度比大;如果是,那麼說明應該是空串,也就是刪去最後一個字母應該會變成;如果是,那麼就要把在的位置新加一個字母,接着比之後的子串和是否相等。無論怎樣,都可以寫爲return s.substring(i).equals(t.substring(j + 1));
;
如果的長度大於的話,證明是類似的;至於兩者長度相等時的證明是顯然的。綜上,算法正確。