# 161 One Edit Distance

給兩個String, S和T判斷兩者是否只要做一個編輯就可以變成對方。

這邊題意有點不清楚,一開始我先列出可能的情況和不清楚的地方

//add
a
ab

//replace
ax
ab

//insert(不確定算不算)
ab
acb

//字母的大小寫算相同還是不同?

先寫了可以add和replace的版本之後,實際跑case發現insert也算,然後大小寫視為不同。

  • Idea: 一找到不一樣的字母,就把長的跳過一個,check後面的substring是否相等
  • Code: 這個解法其實不太快,後來觀察其他人的做法,發現其實最後一個for可以省略,用substring和equals就好

    public class Solution {
        public boolean isOneEditDistance(String s, String t) {
            //base case: 長度相差超過1,就不可能了    
            if(Math.abs(s.length() - t.length()) > 1)
                return false;
    
            //一一比對字母,一有不同就截斷
            int i=0, j=0;
            boolean dif = false;
            for(; i<s.length() && j< t.length(); i++, j++){
                if(s.charAt(i)!=t.charAt(j)){
                    dif = true;
                    break;
                }
            }
    
            //把長的那個跳過一格,繼續檢查後面的,後面若再有不同就是false,後面若都相同就true
            if(i == s.length() && j == t.length())//兩個都走到最後一個字母時,確認最後一個字母一不一樣
                return dif;
    
            if(s.length() > t.length()) i++;
            else if(t.length() > s.length()) j++;
            else{i++; j++;}
    
            for(; i<s.length() && j< t.length(); i++, j++)
                if(s.charAt(i)!=t.charAt(j))    return false;
    
            return true;
        }
    }
    
  • Code(optimize): 把第二個for拿掉看起來比較簡潔。

    public class Solution {
        public boolean isOneEditDistance(String s, String t) {
            //base case: 長度相差超過1,就不可能了    
            if(Math.abs(s.length() - t.length()) > 1)
                return false;
    
            for (int i = 0; i < Math.min(s.length(), t.length()); i++) { 
                if (s.charAt(i) != t.charAt(i)) {
                    if (s.length() == t.length()) 
                        // s has the same length as t, so the only possibility is replacing one char in s and t
                        return s.substring(i + 1).equals(t.substring(i + 1));
                    else if (s.length() < t.length()) // t is longer than s, so the only possibility is deleting one char from t
                        return s.substring(i).equals(t.substring(i + 1));                
                    else // s is longer than t, so the only possibility is deleting one char from s
                        return t.substring(i).equals(s.substring(i + 1));
                }
            }       
            //All previous chars are the same, the only possibility is deleting the end char in the longer one of s and t 
            return Math.abs(s.length() - t.length()) == 1;  
        }
    }
    

results matching ""

    No results matching ""