import java.util.*;
public class Main{
public static void main(String[] args){
Scanner s = new Scanner(System.in);
//防止有循环输入
while(s.hasNext()){
String A = s.nextLine();
String B = s.nextLine();
int num = Levenshtein(A,B);
System.out.println(num);
}
}
public static int Levenshtein(String A , String B){
char[] a = A.toCharArray();
char[] b = B.toCharArray();
int la = a.length;
int lb = b.length;
//简历一个二位数组 大小为 [la+1][lb+1] 因为动规需要用到前一位的状态 所以多给一位用来写第一个数据的前一位
int[][] ints = new int[la+1][lb+1];
//动规一般都需要初始化边界 下面分别是二维数组的两个边界 上面的表示i个字符转化为0个字符需要i步删除操作 下面的是表示0个字符转化为i个字符 需要i步插入操作
for(int i = 0; i <= la; i++){
ints[i][0] = i;
}
for(int i = 0; i <= lb; i++){
ints[0][i] = i;
}
//下面记录除边界外的每一个数据
for(int i = 1; i <= la; i++){
for(int j = 1; j <= lb; j++){
//ints[i][j] 就等于ints[i-1][j] ints[i][j-1]这两个分别 插入一个数据 和删除一个数据需要的操作次数少的一个 再进行一步插入或者删除
ints[i][j] = Math.min(ints[i-1][j] ,ints[i][j-1] ) + 1;
//如果a[i-1] == b[j-1] 这两个字符(第i个和第j个字符因为上面数组多给了一个所以才写a[i-1] == b[j-1])相等 那么这步就不需要操作 ints[i][j]就等于上面进行了插入或者删除操作算出来的ints[i][j] 和 它的上一步ints[i-1][j-1]比较 选一个最小的 如果a[i-1] != b[j-1] 说明需要一步替换操作 所以ints[i][j]就等于上面进行了插入或者删除操作算出来的ints[i][j] 和 它的上一步ints[i-1][j-1]加上一步替换操作后 比较 选一个最小的
if(a[i-1] == b[j-1]){
ints[i][j] = Math.min(ints[i][j] , ints[i-1][j-1]);
}else{
ints[i][j] = Math.min(ints[i][j] , ints[i-1][j-1] + 1);
}
}
}
return ints[la][lb];
}
}