【Leetcode 161】【GO】相隔为 1 的编辑距离
题目
给定两个字符串 s 和 t ,如果它们的编辑距离为 1 ,则返回 true ,否则返回 false 。
字符串 s 和字符串 t 之间满足编辑距离等于 1 有三种可能的情形:
往 s 中插入 恰好一个 字符得到 t
从 s 中删除 恰好一个 字符得到 t
在 s 中用 一个不同的字符 替换 恰好一个 字符得到 t
解题思路
解题最重要的是分析题目
那么,来看满足条件的三种情况。
首先,前两种其实等同为一种情况。因为情况1是s短于t,且s+1字符 = t,情况2是 s-1字符等于 t,可以转化成 t-1字符 = s。所以前两种情况其实是个等式。只要确保 s 短于 t ,就只需要考虑一种情况。再分析。其实情况12可以等价与较短的 s 与较长的t字符顺序和数量相同,只是 t 多了一个字符。
然后,情况 3 可以得出,s 和 t 长度相等,只有一个字符不一致。
代码分析
func isOneEditDistance(s string, t string) bool {
byteS := []byte(s)
byteT := []byte(t)
lenS := len(byteS)
lenT := len(byteT)
if lenS > lenT {
return isOneEditDistance(t, s)
}
if lenT - lenS > 1 {
return false
}
if lenS == 0 && lenT == 1 {
return true
}
idx := 0
flag := false
if lenS == lenT {
for _, cur := range byteT {
if cur != byteS[idx] {
if flag {
return false
}
flag = true
}
idx++
}
if !flag {
return false
}
return true
}
for _, cur := range byteT {
if cur != byteS[idx] {
if flag {
return false
}
flag = true
} else {
idx++
}
if idx == lenS {
return true
}
}
return true
}
有几个注意点。
首先,当 s > t 时,可以交换两个传参,重新调用本方法,就能确保 s <= t 了。
然后,为了方便解析,可以根据 s 和 t 是否相等来判断是情况 2还是情况 3 。
情况 2 需要s 和 t 同时遍历,只有一次 t 和 s 不一致,将 t 跳到下一位。
情况 3 同样同时遍历,但区别是要 s 和 t 同时跳到下一位。完成遍历即可。