题目要求

思路:模拟
- 先比较两字符串长度m、n,长度差异大于1直接false;
- 长度差异不超过1,遍历两字符串(人为保证first较短):
- first[i]=second[j],向后继续遍历检查;
- first[i]=second[j]:
- m=n,则需替换当前位,需修改位数mod加一;
- m=n,则可能是到了缺少的那一位上,将遍历second的指针后移,同时需修改位数mod加一。
- 最后只需判断需修改位数mod即可。
Java
class Solution {
public boolean oneEditAway(String first, String second) {
int n = first.length(), m = second.length();
if(Math.abs(n - m) > 1)
return false;
if(n > m)
return oneEditAway(second, first);
int i = 0, j = 0, mod = 0;
while(i < n && j < m && mod <= 1) {
char cf = first.charAt(i), cs = second.charAt(j);
if(cf == cs) {
i++;
j++;
}
else {
if(n == m) {
i++;
j++;
mod++;
}
else {
j++;
mod++;
}
}
}
return mod <= 1;
}
}
- 时间复杂度:O(max(m,n))
- 空间复杂度:O(1)
C++
class Solution {
public:
bool oneEditAway(string first, string second) {
int n = first.size(), m = second.size();
if(abs(n - m) > 1)
return false;
if(n > m)
return oneEditAway(second, first);
int i = 0, j = 0, mod = 0;
while(i < n && j < m && mod <= 1) {
char cf = first[i], cs = second[j];
if(cf == cs) {
i++;
j++;
}
else {
if(n == m) {
i++;
j++;
mod++;
}
else {
j++;
mod++;
}
}
}
return mod <= 1;
}
};
- 时间复杂度:O(max(m,n))
- 空间复杂度:O(1)
Rust
impl Solution {
pub fn one_edit_away(first: String, second: String) -> bool {
let n = first.len();
let m = second.len();
if n > m {
return Solution::one_edit_away(second, first);
}
if m - n > 1 {
return false;
}
let mut i = 0;
let mut j = 0;
let mut modi = 0;
let first: Vec<char> = first.chars().collect();
let second: Vec<char> = second.chars().collect();
while i < n && j < m && modi <= 1 {
if first[i] == second[j] {
i += 1;
j += 1;
}
else {
if m == n {
i += 1;
j += 1;
modi += 1;
}
else {
j += 1;
modi += 1;
}
}
}
modi <= 1
}
}
- 时间复杂度:O(max(m,n))
- 空间复杂度:O(1)
总结
快乐模拟,自己写出来了Rust~
去改重做PPT辣