• 字符串之间的编辑距离以及字符串交叉组成


    问题一:字符串s1与字符串s2之间的编辑距离为:将s1转换成s2的最少步数,转换过程可以进行的操作有:

    1.插入一个字符

    2.删除一个字符

    3.替换一个字符

    我们用f[i][j]表示s1[0,i]前i个字符组成的字符串,和s2[0,j]前j个字符组成的字符串,之间的编辑距离。若s[i-1]==s[j-1],那么f[i][j]=f[i-1][j-1],若s[i-1]!=s[j-1],那么可以进行操作1,向s1中插入一个字符,则f[i][j]=f[i][j-1]+1,若进行操作2,向s1中删除一个字符,则f[i][j]=f[i-1][j]+1,若进行操作3,进行字符替换,则f[i][j]=f[i-1][j-1]+1。

    int editdis(char *s1,char *s2)
    {
        
        int m=strlen(s1);
        int n=strlen(s2);
        vector<vector<int>> f(m+1,vector<int>(n+1));
        for(int i=0;i<=m;i++)
        {
            f[i][0]=i;
        }
        for(int j=0;j<=n;j++)
            f[0][j]=j;
        for(int i=1;i<=m;i++)
            for(int j=1;j<=n;j++)
            {
                f[i][j]=s1[i-1]==s2[j-1]?f[i-1][j-1]:min(f[i-1][j],min(f[i][j-1],f[i-1][j-1]))+1;
            }
        return f[m][n];
    
    }

    问题二:字符串插入,判断字符串s3能否由s1和s2组成。比如s1字符串为"aabcc",s2字符串为"dbbca",那么字符串s3="aadbbcbcac"就可以由s1和s2交替组成。

    用f[i][j]表示s1[0~i]前i个字符串与s2[0~j]前j个字符串能否组成s3[0~i+j]。

    int inter(char *s1,char *s2,char *s3)
    {
        int len=strlen(s3);
        int m=strlen(s1);
        int n=strlen(s2);
        if(m+n!=len)
            return 0;
        vector<int> f(n+1);
        f[0]=1;
        for(int j=1;j<=n;j++)
            f[j]=s2[j-1]==s3[j-1]&&f[j-1];
        for(int i=1;i<=m;i++)
        {
            f[0]=s1[i-1]==s3[i-1]&&f[0];
            for(int j=1;j<=n;j++)
            {
                f[j]=(s1[i-1]==s3[i+j-1]&&f[j])||(s2[j-1]==s3[i+j-1]&&f[j-1]);
            }
        }
        return f[n];
    }
  • 相关阅读:
    反射-特性
    反射-2
    反射-1
    智能楼宇管理实用手册
    山光凝翠,川容如画——太原西山地区的历史营建与遗存
    城市逆向规划建设:基于城市生长点形态与机制的研究
    建筑快题设计50问与100例
    明清建筑二论·斗栱的起源与发展
    建筑工程计量与计价实训教程(甘肃版)
    室内设计手绘快速表现技法火星课堂
  • 原文地址:https://www.cnblogs.com/beaglebone/p/5877613.html
Copyright © 2020-2023  润新知