1 /*
  2 字符串编辑问题,给定一个源字符串和目的字符串,源字符串可以insert,delete,replace,求最少操作使其变成目标字符串,有两种方法,方法一采用
  3 动态规划方法,f[i][j]=min{f[i-1][j]+1,f[i+1][j]+1,f[i-1][j-1]+(s[i]==t[j]?0:1)}.方法二采用递归实现(这个是求相似度,意思是一样的),没有动态规划好
  4 两个子串一个到另一的距离和另一个到它的距离是一样的。
  5 */
  6 
  7 #include <iostream>
  8 using namespace std;
  9 #include <string>
 10 
 11 //动态规划方法,f[i][j]表示从【0--i】和【0---j】的最小操作数,
 12 /*
 13 f[i][j]=min{f[i-1][j]+1(此为删除s[i]操作),f[i][j-1]+1(此为增加d[j]操作,f[i-1][j-1]+(s[i]==d[j]?0:1)(此为,如果s[i]==d[j],则说明相等,不用操作,否则替换操作)
 14 f[0][0]=0;
 15 f[0][j]={0,1,2,3,4,5,6,....j};   //都为插入
 16 f[i][0]={0,1,2,3,.....i};         //都为删除
 17 */
 18 
 19 int minoperation(const string & sour,const string & dest)
 20 {
 21     int row=sour.size();
 22     int colom=dest.size();
 23     if(row==0)               //直接插入或删除
 24         return colom;
 25     if(colom==0)
 26         return row;
 27     int ** result=new int * [row+1];
 28     if(result==NULL)
 29     {
 30         cout<<"wrong"<<endl;
 31         exit(1);
 32     }
 33     for(int i=0;i<=row;i++)
 34     {
 35         result[i]=new int[colom+1];
 36         if(result[i]==NULL)
 37         {
 38             cout<<"wrong"<<endl;
 39             exit(1);
 40         }
 41     }
 42     for(int i=0;i<=row;i++)
 43         result[i][0]=i;
 44     for(int j=1;j<=colom;j++)
 45         result[0][j]=j;
 46     for(int i=1;i<=row;i++)
 47         for(int j=1;j<=colom;j++)
 48         {
 49             result[i][j]=min(min(result[i-1][j]+1,result[i][j-1]+1),result[i-1][j-1]+(sour[i-1]==dest[j-1]?0:1));  //注意sour[i-1]是因为sour是从0开始,而result多了开始的0.
 50         }
 51     int tmp=result[row][colom];
 52     for(int i=0;i<=row;i++)
 53         delete[] result[i];
 54     delete[] result;
 55     return tmp;
 56 }
 57 
 58 /*
 59 方法二,采用递归的方法
 60 s="ACAATCC"
 61 D="AGCATGC"
 62 两个指针分别指向两个序列,sbegin,dbegin.
 63 */
 64 int minoperation2(const string & sour,const string & dest,int sbegin,int send,int dbegin,int dend)
 65 {
 66     if(sbegin>send)               
 67     {
 68         if(dbegin<dend)                //最后没有了,只能全删除或全添加上才能一样
 69         {
 70             return dend-dbegin+1;
 71         }
 72         else
 73             return 0;
 74     }
 75     if(dbegin>dend)
 76     {
 77         if(sbegin<send)           //最后没有了,只能全删除或全添加上才能一样
 78         {
 79             return send-sbegin+1;
 80         }
 81         else
 82             return 0;
 83     }
 84     if(sour[sbegin]==dest[dbegin])
 85     {
 86         return minoperation2(sour,dest,sbegin+1,send,dbegin+1,dend);
 87     }
 88     else
 89     {
 90         int t1=minoperation2(sour,dest,sbegin+1,send,dbegin+1,dend);
 91         int t2=minoperation2(sour,dest,sbegin,send,dbegin+1,dend);
 92         int t3=minoperation2(sour,dest,sbegin+1,send,dbegin,dend);
 93         return min(min(t1,t2),t3)+1;
 94     }
 95 }
 96 int main()
 97 {
 98     string source="ACAATCC";
 99     string dest="AGCATGC";
100     //cout<<minoperation(source,dest)<<endl;
101     cout<<minoperation2(source,dest,0,source.size(),0,dest.size())<<endl;
102     system("pause");
103 }
 posted on 2014-07-24 22:45  zmlctt  阅读(375)  评论(0编辑  收藏  举报