面试题 01.05. 一次编辑
题目描述:
思路:
firstLen := len(first) // 第一个字符串的长度 secondLen := len(second) // 第二个字符串的长度 differVal := math.Abs(float64(firstLen - secondLen)) // 二者长度的差值 longStr := "" // 用于存放长的那个字符串 shortStr := "" // 用于存放短的那个字符串
整体可以考虑三种情况:
differVal >= 2 这个时候是不可能通过0次或1次编辑达到二者一样的,直接返回false。
differVal == 0 这个时候只需要判断不一样的字符个数,如果大于1,就说明通过0次或1次编辑是不可能达到二者一样的,直接返回false;反之可以,返回true即可。
differVal == 1这个时候不用思考的那么复杂,具体见题解:
题解:
func oneEditAway(first string, second string) bool { firstLen := len(first) secondLen := len(second) differVal := math.Abs(float64(firstLen - secondLen)) if differVal >= 2 { return false } else if differVal == 1 { longStr := "" // 长字符串 shortStr := "" // 短字符串 if firstLen > secondLen { longStr = first shortStr = second } else { longStr = second shortStr = first } // 为两个字符串分别定义一个指针:lenStrPoint,shortStrPoint lenStrPoint := 0 shortStrPoint := 0 // 定义一个计数器 count:=0 // 遍历完短字符串为止 for shortStrPoint < len(shortStr) { // 如果二者指针指向的字符不同,长指针++ if shortStr[shortStrPoint] != longStr[lenStrPoint] { lenStrPoint++ count++ if count>1 { return false } }else { // 否则都++ shortStrPoint++ lenStrPoint++ } } } else if differVal == 0 { count := 0 for i := 0; i < firstLen; i++ { if first[i] != second[i] { count++ } if count > 1 { return false } } } return true }
提交结果: