博文中会简要介绍Leetcode P0161题目分析及解题思路。
“One Edit Distance”这道题是“最短编辑距离”的简化版,原题需要使用动态规划,而这道题由于只需要确定当前的编辑距离是不是恰好为1,解法上无需用动态规划,可以扫一遍得到结果。
Given two strings s and t, return true if they are both one edit distance apart, otherwise return false.
A string s is said to be one distance apart from a string t if you can:
- Insert exactly one character into s to get t.
- Delete exactly one character from s to get t.
- Replace exactly one character of s with a different character to get t.
主要思路如下,
-
若两个字符串长度差超过1,或者两个字符串完全相等,则返回
false
。 -
遍历字符串
s
为,参考字符串t
,若两者有不一致的地方,则有下述情况,- 两者长度相等,则一定是
replace
操作。 - 字符串
s
更长,则是delete
操作。 - 字符串
t
更长,则是insert
操作。
- 两者长度相等,则一定是
-
若任何情况下,上述条件不满足,则其编辑距离都不会是1。
以下是Java的题解代码实现。
class Solution {
public boolean isOneEditDistance(String s, String t) {
int L1 = s.length(), L2 = t.length();
if (Math.abs(L2-L1) > 1 || s.equals(t))
return false;
// 长度相差1时,任何一个字符串长度为0,两者之间编辑距离都是1
if (L1 == 0 || L2 == 0)
return true;
int dist = 0, si = 0, ti = 0;
while (si < L1) {
if (ti == L2 || s.charAt(si) != t.charAt(ti)) {
++dist;
if (dist > 1)
return false;
// Insert
if (L1 < L2) {
++ti;
}
// Replace
else if (L1 == L2) {
++si;
++ti;
}
// Delete
else {
++si;
}
}
else {
++si;
++ti;
}
}
return true;
}
}
以下是C++的题解代码实现。
class Solution {
public:
bool isOneEditDistance(string s, string t) {
int L1 = s.length(), L2 = t.length();
if (abs(L2-L1) > 1 || s == t)
return false;
if (L1 == 0 || L2 == 0)
return true;
int dist = 0, si = 0, ti = 0;
while (si < L1) {
if (ti == L2 || s[si] != t[ti]) {
++dist;
if (dist > 1)
return false;
if (L1 > L2)
++si;
else if (L1 < L2)
++ti;
else {
++si;
++ti;
}
}
else {
++si;
++ti;
}
}
return true;
}
};