Given two strings s and t, return true if they are both one edit distance apart, otherwise return false.
A string s is said to be one distance apart from a string t if you can:
- Insert exactly one character into
sto gett. - Delete exactly one character from
sto gett. - Replace exactly one character of
swith a different character to gett.
Example 1:
Input: s = "ab", t = "acb" Output: true Explanation: We can insert 'c' into s to get t.
Example 2:
Input: s = "", t = "" Output: false Explanation: We cannot get t from s by only one step.
Example 3:
Input: s = "a", t = "" Output: true
Example 4:
Input: s = "", t = "A" Output: true
Constraints:
0 <= s.length <= 1040 <= t.length <= 104sandtconsist of lower-case letters, upper-case letters and/or digits.
A:
*************递归*****************
class Solution { public: bool isOneEditDistance(string s, string t) { int n1 = s.length(); int n2 = t.length(); if(n1 > n2) return isOneEditDistance(t,s); if(n1==0){ return n2==1; } if(s[0]==t[0]){ return isOneEditDistance(s.substr(1), t.substr(1)); }else{ // not equal if(n1==n2) // replace on first return s.substr(1) == t.substr(1); else // remove the first of longer return s == t.substr(1); } } };不用递归, 直接用两个指针, 这样快一些。
class Solution { public: bool isOneEditDistance(string s, string t) { int n1 = s.length(); int n2 = t.length(); if(n1 > n2) return isOneEditDistance(t,s); if(n1+1<n2) return false; for(int is = 0; is<n1;is++){ if( s[is] != t[is]){ if(n1==n2) return s.substr(is+1) == t.substr(is+1); else return s.substr(is) == t.substr(is+1); } } return n1+1==n2;// for case s="ab" t="abc" } };
就是简单的分情况讨论
public class Solution {
public boolean isOneEditDistance(String s, String t) {
int n1 = s.length(), n2 = t.length();
if( n1< n2)
return n1+1 == n2 && delOneStep(t,s);
else if(n1 == n2)
return changeOneStep(s,t);
else return n1-1 == n2 && delOneStep(s,t);
}
private boolean changeOneStep(String s, String t){
int nDif = 0;
for(int i =0;i<s.length();i++){
if(s.charAt(i) != t.charAt(i))
nDif++;
}
return nDif==1;
}
private boolean delOneStep(String sLong, String sShort){
int dif = 0;
for(int i = 0;i<sShort.length();i++){
if(sShort.charAt(i)!=sLong.charAt(i+dif)){
if(dif!=0)
return false;
i--;
dif=1;
}
}
return true;
}
}
Mistakes:
No comments:
Post a Comment