随笔-8  评论-0  文章-1  trackbacks-0
/*问题描述:设S1和S2是两个字符串。要用最少的字符操作将字符串S1转换为字符串S2。这里的字符串操作包括:

(1)删除一个字符

(2)插入一个字符

(3)将一个字符改成为另一个字符。

将字符串S1转换为字符串S2的所用的最少的字符串操作数称作字符串S1到S2的最短距离,记为 d(S1, S2). 

算法设计:给定字符串S1和S2,计算它们的最短编辑距离d(S1, S2)。
*/

/*算法思想:
  用数组b[i][j]记录s1[1..i]和s2[1..j]之间的编辑长度。
  递归公式
   b[i][j]=min(b[i-1]][j],b[i][j-1],b[i][j]+(s1[i]==s2[i]?0:1));
*/

public class EditDistance
{
 
public int  editDistance(String s,String aim)
 
{
     
int sLength=s.length()+1;
     
int aLength=aim.length()+1;
     
int[][] b=new int[aLength][sLength];
     
for(int i=1;i<sLength;i++)
     
{
         b[
0][i]=i;
     }

     
for(int k=1;k<aLength;k++)
     
{
          b[k][
0]=k;
     }

     
for(int j=1;j<sLength;j++)
     
{
         
for(int i=1;i<aLength;i++)
         
{
         
int x=b[i-1][j]+1;
             
int y=b[i][j-1]+1;
             
int z=b[i-1][j-1]+((s.charAt(i-1)==aim.charAt(j-1))?0:1);
             b[i][j]
=min(x,y,z);
              }

     }

     
     
return b[aLength-1][sLength-1];
     }

     
public int min(int x,int y,int z)
     
{
         
int temp;
         
if(x<y)
         
{
             temp
=x;
         }

         
else temp=y;
         
if(z<temp) temp=z;
         
return temp;
     }

     
public static void main(String []args)
     
{
         String s
="hhdeihhh";
         System.out.println(s.length());
         String aim
="hheepppk";
         System.out.println(aim.length());
         EditDistance ed
=new EditDistance();
         System.out.println(ed.editDistance(s,aim));
     }

     
}
posted on 2008-06-26 10:53 夏日清风 阅读(679) 评论(0)  编辑  收藏 所属分类: 算法

只有注册用户登录后才能发表评论。


网站导航: