String - 161. One Edit Distance
- One Edit Distance
Given two strings S and T, determine if they are both one edit distance apart.
Have you met this question in a real interview? Yes
Problem Correction
Example
Example 1:
Input: s = "aDb", t = "adb"
Output: true
Example 2:
Input: s = "ab", t = "ab"
Output: false
Explanation:
s=t ,so they aren't one edit distance apart
思路:
题目意思是两个字符串,通过一次替换或者增加或者删除操作,使得两个字符串相等。增加和删除其实属于一类,因为相对于短的字符串是增加,而长的字符串是减少,所以问题分类为两类。一类是替换,一类是增加删除。替换的在一次遍历的时候,只允许相同位置,出现一次字符不相同,增加和删除也是类似,找出相邻字符不同的情况只允许出现一次。
代码:
java:
public class Solution {
/**
* @param s: a string
* @param t: a string
* @return: true if they are both one edit distance apart or false
*/
public boolean isOneEditDistance(String s, String t) {
// write your code here
if (s == null && t == null) return true;
if (s == null || t == null) return false;
int slen = s.length();
int tlen = t.length();
if (slen == tlen) return isOneChangeDistance(s, t);
else if (slen - tlen == 1) return isOneRemoveDistance(s, t);
else if (tlen - slen == 1) return isOneRemoveDistance(t, s);
return false;
}
private boolean isOneChangeDistance(String s, String t) {
int len = s.length();
boolean flag = false;
for (int i = 0; i < len; i++){
if (s.charAt(i) != t.charAt(i)) {
if (flag) {
return false;
} else {
flag = true;
}
}
}
return flag;
}
private boolean isOneRemoveDistance(String s, String t) {
int len = t.length();
boolean flag = false;
for (int slow = 0, fast = 0; slow < len; slow++) {
if (s.charAt(fast) != t.charAt(slow)) {
if (flag) {
return false;
}
flag = true;
slow--;
}
fast++;
}
return true;
}
}