Java 是Levenshtein';s距离是解决此编辑步骤问题的正确方法吗?
我很熟悉Levenshtein的距离,所以我决定用它来解 我的解决办法是:Java 是Levenshtein';s距离是解决此编辑步骤问题的正确方法吗?,java,levenshtein-distance,Java,Levenshtein Distance,我很熟悉Levenshtein的距离,所以我决定用它来解 我的解决办法是: import java.io.*; import java.util.*; class LevenshteinParaElJuez implements Runnable{ static String ReadLn(int maxLength){ // utility function to read from stdin,
import java.io.*;
import java.util.*;
class LevenshteinParaElJuez implements Runnable{
static String ReadLn(int maxLength){ // utility function to read from stdin,
// Provided by Programming-challenges, edit for style only
byte line[] = new byte [maxLength];
int length = 0;
int input = -1;
try{
while (length < maxLength){//Read untill maxlength
input = System.in.read();
if ((input < 0) || (input == '\n')) break; //or untill end of line ninput
line [length++] += input;
}
if ((input < 0) && (length == 0)) return null; // eof
return new String(line, 0, length);
}catch (IOException e){
return null;
}
}
public static void main(String args[]) // entry point from OS
{
LevenshteinParaElJuez myWork = new LevenshteinParaElJuez(); // Construct the bootloader
myWork.run(); // execute
}
public void run() {
new myStuff().run();
}
}
class myStuff implements Runnable{
public void run(){
ArrayList<String> theWords = new ArrayList<String>();
try
{
/// PLACE YOUR JAVA CODE HERE
String leido=LevenshteinParaElJuez.ReadLn(100);
//System.out.println("lo leido fue "+leido);
while (leido.length() != 0){
theWords.add(leido);
leido=LevenshteinParaElJuez.ReadLn(100);
}
}catch(Exception e){
System.out.println("El programa genero una excepcion");
}
int maxEdit=0;
int actualEdit=0;
int wordsIndex1 =0, wordsIndex2=0;
while (wordsIndex1<= theWords.size())
{
while (wordsIndex2<= theWords.size()-1){
actualEdit=Levenshtein.computeLevenshteinDistance(theWords.get(wordsIndex1),theWords.get(wordsIndex2));
if (actualEdit>maxEdit){maxEdit=actualEdit;}
wordsIndex2++;
}
wordsIndex1++;
}
System.out.println(maxEdit+1);
}
}
class Levenshtein {
private static int minimum(int a, int b, int c) {
if(a<=b && a<=c)
return a;
if(b<=a && b<=c)
return b;
return c;
}
public static int computeLevenshteinDistance(String str1, String str2) {
return computeLevenshteinDistance(str1.toCharArray(),
str2.toCharArray());
}
private static int computeLevenshteinDistance(char [] str1, char [] str2) {
int [][]distance = new int[str1.length+1][str2.length+1];
for(int i=0;i<=str1.length;i++)
distance[i][0]=i;
for(int j=0;j<=str2.length;j++)
distance[0][j]=j;
for(int i=1;i<=str1.length;i++)
for(int j=1;j<=str2.length;j++)
distance[i][j]= minimum(distance[i-1][j]+1,
distance[i][j-1]+1,
distance[i-1][j-1]+
((str1[i-1]==str2[j-1])?0:1));
return distance[str1.length][str2.length];
}
}
它为该示例生成正确的输出:
5
法官拒绝了我的回答。这是我第一次尝试解决在线法官的问题,我想我可能会在这里强迫一个正确的答案:
System.out.println(maxEdit+1);
因为当使用Levenshtein简单计算时,maxEdit的值为4。这就是问题所在吗?问题指出,您需要在字典中查找按字母顺序排列的最长序列,这样序列中的每个单词都可以通过添加、删除或更改一个字母来形成 因此,样本结果中的5表示序列(dig、fig、fin、fine、wine)
我不认为Levenshtein与这个问题特别相关,尽管我可能只是想象力不够。Levenshtein没有捕获每个步骤都必须在字典中以及以后在字典中的要求。Levinshtein是相关的,但不会给您在输出中使用的值。在此问题中,使用它来确定两个单词的编辑距离是否正好为1,这表示所比较的两个单词在编辑阶梯中相邻 在dict中的单词上迭代。如果下一个单词与当前单词的编辑距离为1,则可以将其设置为当前单词,否则必须跳过 解决这个问题的诀窍是找到所有可能的序列-仅仅因为下一个单词的编辑距离为1并不意味着在阶梯中使用它将获得最长的阶梯
System.out.println(maxEdit+1);