zoukankan      html  css  js  c++  java
  • Leetcode: One Edit Distance

    Given two strings S and T, determine if they are both one edit distance apart.

    注意这道题:Must be exactly one distance apart. Not the same.

     1 public class Solution {
     2     public boolean isOneEditDistance(String s, String t) {
     3         for (int i=0; i<Math.min(s.length(), t.length()); i++) {
     4             if (s.charAt(i) != t.charAt(i)) {
     5                 if (s.length() == t.length()) 
     6                     return s.substring(i+1).equals(t.substring(i+1));
     7                 else if (s.length() < t.length()) {
     8                     return s.substring(i).equals(t.substring(i+1));
     9                 }
    10                 else return t.substring(i).equals(s.substring(i+1));
    11             }
    12         }
    13         
    14         //Corner case, last char
    15         return Math.abs(s.length() - t.length()) == 1;
    16     }
    17 }

     另外FB面经有一道比较狠的这个题的变形:

    class IntFileIterator {
      boolean hasNext();
      int next();
    }
    
    class{
      public boolean isDistanceZeroOrOne(IntFileIterator a, IntFileIterator b);
    
    }
    // return if the distance between a and b is at most 1.. 
    // Distance: minimum number of modifications to make a=b
    // Modification:
    //   1. change an int in a
    //   2. insert an int to a
    //   3. remove an int from a

    这题就是one edit distance的变形题,难点在于给的Iterator,事先不知道两个file
    的长度,也不允许用extra space(所以不能转成两个string再比),那么一个个往前
    跑的时候就得三种情况都考虑。。。。

    我的做法:

     1 public class Solution {
     2     class IntFileIterator {
     3         boolean hasNext();
     4         int next();
     5     }
     6     
     7     public boolean isDistanceZeroOrOne(IntFileIterator a, IntFileIterator b) {
     8         return check(a, b, 0);
     9     }
    10   
    11       public boolean check(IntFileIterator a, IntFileIterator b, int distance){
    12           IntFileIterator aa = new InFileIterator(a); // copy of iterator a before next() function
    13           IntFileIterator bb = new InFileIterator(b);
    14           while (a.hasNext() && b.hasNext()) {
    15               int s = a.next();
    16               int t = b.next();
    17               if(s != t){
    18                   IntFileIterator aaa = new InFileIterator(a); //copy of iterator a after next() function
    19                   IntFileIterator bbb = new InFileIterator(b);
    20                   distance++;
    21                   if(distance>1) return false;
    22                   return check(aa, b, distance) || check(a, bb, distance) || check(aaa, bbb, distance);
    23               }
    24               else{
    25                   return check(a, b, distance);
    26               }
    27           }
    28           
    29           if(distance == 1){
    30               return !a.hasNext() && !b.hasNext();
    31           }else { //(distance ==0)
    32               IntFileIterator k = a.hasNext()? a : b;
    33               int count = 0;
    34               while (k.hasNext()) {
    35                   k.next();
    36                   count++;
    37               }
    38               return k<=1;
    39           }
    40       }
    41 }
  • 相关阅读:
    Webpack中publicPath设置
    忘记Mysql的root密码怎么办?
    Visual Studio 2015上安装Entity Framework Power Tools
    Ubuntu下安装中文输入法
    Ubuntu如何选择更新源
    Orchard中如何配置远端发布
    .Net缓存管理框架CacheManager
    全新的membership框架Asp.net Identity(2)——绕不过的Claims
    全新的membership框架Asp.net Identity(1)——.Net membership的历史
    泛型使用中,解决类型转换问题
  • 原文地址:https://www.cnblogs.com/EdwardLiu/p/4245378.html
Copyright © 2011-2022 走看看