标题:面试题01.05一次修改-中等
题目
字符串有三种编辑操作:插入一个字符、删除一个字符或者替换一个字符。 给定两个字符串,编写一个函数判定它们是否只需要一次(或者零次)编辑。
示例1
输入:
first = "pale"
second = "ple"
输出: True
示例2
输入:
first = "pales"
second = "pal"
输出: False
代码Go
- 判断两者的长度是否相差大于1
- 若大于1 则表示 一次修改无效
- 若不大于1,向下进行
- 若两者本身就相同,那么就说明可以进行一次修改
- 若两者本身不相同,则先找到不相同位置索引
- 若firstLen > secondLen 说明:second需要插入 <==> first删除
- 若firstLen > secondLen 说明:second需要删除 <==> first添加
- 若firstLen == secondLen 说明:修改其一就行
- 最后返回 修改后的两者是否相同
func oneEditAway(first string, second string) bool {
firstLen := len(first)
secondLen := len(second)
// 1. 若长度相差2,直接返回false
if math.Abs(float64(firstLen-secondLen)) > 1 {
return false
}
// 若本身就相同 就直接返回true
if first == second {
return true
}
// 2. 判断是否需要删除或插入还是修改 以first为基准
i := 0
for i = 0; i < secondLen && i < firstLen; i++ {
if first[i] != second[i] {
break
}
}
if firstLen > secondLen { // second需要插入 <==> first删除
temp := first[i+1:]
first = first[:i]
first = first + temp
} else if firstLen < secondLen { // second需要删除 <==> first添加
temp := second[i+1:]
second = second[:i]
second = second + temp
} else { // 需要修改
temp := second[i+1:]
second = second[:i]
second = second + string(first[i]) + temp
}
fmt.Printf("first: %v\n", first)
fmt.Printf("second: %v\n", second)
return first == second
}