溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用Java怎么計算數組滾動的距離

發(fā)布時間:2021-04-14 16:13:39 來源:億速云 閱讀:189 作者:Leah 欄目:編程語言

這篇文章將為大家詳細講解有關使用Java怎么計算數組滾動的距離,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

用法示例:

StringUtils.getLevenshteinDistance(null, *)       = IllegalArgumentException
StringUtils.getLevenshteinDistance(*, null)       = IllegalArgumentException
StringUtils.getLevenshteinDistance("","")        = 0
StringUtils.getLevenshteinDistance("","a")       = 1
StringUtils.getLevenshteinDistance("aaapppp", "")    = 7
StringUtils.getLevenshteinDistance("frog", "fog")    = 1
StringUtils.getLevenshteinDistance("fly", "ant")    = 3
StringUtils.getLevenshteinDistance("elephant", "hippo") = 7
StringUtils.getLevenshteinDistance("hippo", "elephant") = 7
StringUtils.getLevenshteinDistance("hippo", "zzzzzzzz") = 8
StringUtils.getLevenshteinDistance("hello", "hallo")  = 1

Java代碼:

public static int getLevenshteinDistance(String s, String t) {
  if (s == null || t == null) {
    throw new IllegalArgumentException("Strings must not be null");
  }
  int n = s.length(); // length of s
  int m = t.length(); // length of t
  if (n == 0) {
    return m;
  } else if (m == 0) {
    return n;
  }
  if (n > m) {
    // swap the input strings to consume less memory
    String tmp = s;
    s = t;
    t = tmp;
    n = m;
    m = t.length();
  }
  int p[] = new int[n+1]; //'previous' cost array, horizontally
  int d[] = new int[n+1]; // cost array, horizontally
  int _d[]; //placeholder to assist in swapping p and d
  // indexes into strings s and t
  int i; // iterates through s
  int j; // iterates through t
  char t_j; // jth character of t
  int cost; // cost
  for (i = 0; i<=n; i++) {
    p[i] = i;
  }
  for (j = 1; j<=m; j++) {
    t_j = t.charAt(j-1);
    d[0] = j;
    for (i=1; i<=n; i++) {
      cost = s.charAt(i-1)==t_j ? 0 : 1;
      // minimum of cell to the left+1, to the top+1, diagonally left and up +cost
      d[i] = Math.min(Math.min(d[i-1]+1, p[i]+1), p[i-1]+cost);
    }
    // copy current distance counts to 'previous row' distance counts
    _d = p;
    p = d;
    d = _d;
  }
  // our last action in the above loop was to switch d and p, so p now 
  // actually has the most recent cost counts
  return p[n];
}

實際上,上述代碼的空間復雜度還可以進一步簡化,使用一維數組替換滾動數組。

Java代碼:

public int minDistance(String s, String t) {
  if (s == null || t == null) {
    throw new IllegalArgumentException("Strings must not be null");
  }
  int n = s.length(); // length of s
  int m = t.length(); // length of t
  if (n == 0) {
    return m;
  } else if (m == 0) {
    return n;
  }
  if (n > m) {
    // swap the input strings to consume less memory
    String tmp = s;
    s = t;
    t = tmp;
    n = m;
    m = t.length();
  }
  int d[] = new int[n+1]; // cost array, horizontally
  // indexes into strings s and t
  int i; // iterates through s
  int j; // iterates through t
  char t_j; // jth character of t
  int cost; // cost
  for (i = 0; i<=n; i++) {
    d[i] = i;
  }
  for (j = 1; j<=m; j++) {
    t_j = t.charAt(j-1);
    int pre = d[0];
    d[0] = j;
    for (i=1; i<=n; i++) {
      int temp = d[i];
      cost = s.charAt(i-1)==t_j ? 0 : 1;
      // minimum of cell to the left+1, to the top+1, diagonally left and up +cost
      d[i] = Math.min(Math.min(d[i-1]+1, d[i]+1), pre+cost);
      pre = temp;
    }  
  }
  return d[n];
}

關于使用Java怎么計算數組滾動的距離就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI