예제 #1
0
 bool isOneEditDistance(string s, string t) {
     int m = s.length(), n = t.length();
     if (m > n) return isOneEditDistance(t, s);
     if (n - m > 1) return false;
     bool mismatch = false;
     for (int i = 0; i < m; i++) {
         if (s[i] != t[i]) {
             if (m == n) s[i] = t[i];
             else s.insert(i, 1, t[i]);
             mismatch = true;
             break;
         }
     }
     return (!mismatch && n - m == 1) || (mismatch && s == t);
 }
예제 #2
0
 // Must be exactly one distance apart. same then return false 
 bool isOneEditDistance(string s, string t) {
     int s_len = s.length(), t_len = t.length();
     if(abs(s_len-t_len)>1) return false;
     if(s_len > t_len) return isOneEditDistance(t, s);
     for(int i=0; i<s_len; i++){
         if(s[i]==t[i]) continue;
         if(s_len == t_len){
             // check if already reach the last char
             return (i+1 == s_len ) ? true : s.substr(i+1) == t.substr(i+1);
         }else{
             // s="ac" t="adc"
             return s.substr(i) == t.substr(i+1) ;
         }
     }
     return (s_len==t_len) ? false : true; // s="", t="a" s="", t=""
 }
예제 #3
0
 bool isOneEditDistance(string s, string t) {
     int m = s.size(), n = t.size();
     if(m < n) return isOneEditDistance(t, s);
     if(s==t || m-n>1) return false;
     int cnt = 0, i = 0, j = 0;
     if(m != n) cnt = 1;
     while(j < n){
         if(s[i++] != t[j++]){
             if(m==n || i!=j)
                 ++cnt;
             else
                 --j;
         }
     }
     
     return cnt==1;
 }
예제 #4
0
 bool isOneEditDistance(string s, string t) {
     int m = s.size(), n = t.size();
     if (m > n) return isOneEditDistance(t, s); //s is shorter
     
     if (s == t || n - m > 1)
         return false;
     for (int i = 0; i < m; i++) {
         if (s[i] == t[i])
             continue;
         //find the first difference
         if (m == n)
             return s.substr(i + 1) == t.substr(i + 1);
         else
             return s.substr(i) == t.substr(i + 1);
     }
     return true;
 }
예제 #5
0
bool Solution::isOneEditDistance(string s, string t)
{
    int m = s.length(), n = t.length();
    if (m > n) return isOneEditDistance(t, s);
    if (n - m > 1)
        return false;
    int i = 0, shift = n - m;
    while (i < m && s[i] == t[i])
        i++;
    if (i == m)
        return shift > 0;
    if (shift == 0)
        i++;
    while (i < m && s[i] == t[i + shift])
        i++;
    return i == m;
}
예제 #6
0
 bool isOneEditDistance(string s, string t) {
     if (s.size() > t.size()) return isOneEditDistance(t,s);
     const int len_s = s.size(), len_t = t.size(), diff = len_t-len_s;
     if (diff > 1) return false;
     
     int i = 0, j = 0;
     while (i < len_s && j < len_t && s[i] == t[j]) {
         i++; j++;
     }
     if (i == len_s) return j+1 == len_t;
     
     j++;
     if (diff == 0) i++;
     while (i < len_s && j < len_t && s[i] == t[j]) {
         i++; j++;
     }
     return i == len_s && j == len_t;
 }
예제 #7
0
 bool isOneEditDistance(string s, string t) {
     bool flag = false;
     int m = s.size(); 
     int n = t.size();
     if(m>n) return isOneEditDistance(t,s);
     if(n-m>1) return false;
     for(int i=0; i<m; i++){
         if(s[i]!=t[i]){
             if(m==n){
                 s[i] = t[i];
             }else{
                 s.insert(i,1,t[i]);
             }
             flag = true;
             break;
         }
     }
     return (!flag && n-m==1) || (flag && s==t);
 }
 bool isOneEditDistance(string s, string t) {
     int m = s.length(), n = t.length();
     /** swap the string s and t to ensure the size of s is smaller than t**/
     if(m > n) return isOneEditDistance(t, s);
     if(n - m > 1) return false;
     /** check if there exist mismatch char only one time **/
     bool mismatch = false;
     for(int i = 0; i < m; i++) {
         if(s[i] != t[i]) {
             if(m == n)  s[i] = t[i];
             else s.insert(i, 1, t[i]);
             mismatch = true;
             break;
         }
     }
     /** 2 cases 
      *  1) all the m char are matched, so we just check to delete the one char rebundant
      *  2) find the mismatch char, so we replace it and check (s == t)
      **/
     return (!mismatch && n-m==1) || (mismatch && s == t);
 }
예제 #9
0
    bool isOneEditDistance(string s, string t) {
        int n = s.length();
        int m = t.length();
        
        if (n == m) {
            int count = 0;
            for (int i = 0; i < n; ++i) {
                if (s[i] != t[i]) {
                    count++;
                }
            }
            return count == 1;
        } else if (n == m + 1) {
            // n > m
            if (m == 0) {
                return true;
            }

            int i = 0, j = 0;
            int count = 0;
            
            //ba
            //a
            while (i < n && j < m) {
                 if (s[i] != t[j]) {
                    count++;
                    i++;
                 } else {
                     j++;
                     i++;
                 }
            }
            return count == 1 || i == j;
        } else if (n + 1 == m) {
            return isOneEditDistance(t, s);
        } else {
            return false;
        }
    }