题目描述
字符串有三种编辑操作:插入一个字符、删除一个字符或者替换一个字符。 给定两个字符串,编写一个函数判定它们是否只需要一次(或者零次)编辑。
示例1:
输入: first = "pale" second = "ple" 输出: True
示例2:
输入: first = "pales" second = "pal" 输出: False
解法
双指针。
先判断两字符串长度差diff
是否大于 1,若是直字符间距加宽2磅怎么设置接返回 false。
接着开始遍历两字符串。若两个指针i
,j
所指向的字指针式万用表使用方法符first[i]
与second[j]
不相同:
- 若
diff == 1
,则i++
- 若
diff == -1
,则j++
- 若
diff == 0
,则i++
,j++
同时编辑次数op
减 1。
若两个指针i
,j
所指指针数组和数组指针的区别向的字符相同,则i++
,j++
。
判断剩余编辑次数是否小于 0,若是,说明不满足一次编辑条件,直接返回 false。
遍历结束,直接返回 true。
class Solution: def oneEditAway(self, first: str, second: str) -> bool: n1, n2 = len(first), len(second) diff = n1 - n2 if abs(diff) > 1: return False i, j, op = 0, 0, 1 while i < n1 and j < n2: not_same = first[i] != second[j] if not_same: if diff == 1: i += 1 elif diff == -1: j += 1 else: i += 1 j += 1 op -= 1 else: i += 1 j += 1 if op < 0: return False return True
Java
class Solution { public boolean oneEditAway(String first, String second) { int n1 = first.length(), n2 = second.length(); int diff = n1 - n2; if (Math.abs(diff) > 1) { return false; } int op = 1; for (int i = 0, j = 0; i < n1 && j < n2; ++i, ++j) { boolean notSame = first.charAt(i) != second.charAt(j); if (notSame) { if (diff == 1) { // --j, ++i, ++j => ++i --j; } else if (diff == -1) { // --i, ++i, ++j => ++j --i; } --op; } if (op < 0) { return false; } } return true; } }
C++
class Solution { public: bool oneEditAway(string first, string second) { int n1 = first.size(), n2 = second.size(); int diff = n1 - n2; if (abs(diff) > 1) { return false; } int op = 1; for (int i = 0, j = 0; i < n1 && j < n2; ++i, ++j) { bool notSame = first[i] != second[j]; if (notSame) { if (diff == 1) { --j; } else if (diff == -1) { --i; } --op; } if (op < 0) { return false; } } return true; } };
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
评论(0)