diff函数的实现——LCS的变种问题

  昨天去去哪儿笔试,碰到了一个我们一直很熟悉的命令(diff——ubuntu下面),可以比较字符串,即根据最长公共子串问题,如果A中有B中没有的字符输出形式如下(-ch),如果A中没有,B中有可以输出如下形式(+ch).

#include <iostream>
#include <cstring>
#include <vector>
using namespace std;

string LCS(string &s1, string &s2)
{
    int row = s1.size();
    int col = s2.size();
    string table[row + 1][col + 1];
    char rowChar[row + 1];
    char colChar[col + 1];
    int cnt = 0;
    rowChar[0] = colChar[0] = ‘\0‘;
    for(int i = row - 1, cnt = 1; i >= 0; i--, cnt++)
    {
        rowChar[cnt] = s1[i];
    }
    for(int i = col - 1, cnt = 1; i >= 0; i--, cnt++)
    {
        colChar[cnt] = s2[i];
    }
    char ch1, ch2;
    string str1, str2;
    for(int i = 1; i <= row; i++)
    {
        for(int j = 1; j <= col; j++)
        {
            ch1 = rowChar[i];
            ch2 = colChar[j];
            if(ch1 == ch2)
                table[i][j] = ch1 + table[i - 1][j - 1];
            else
            {
                str1 = table[i - 1][j];
                str2 = table[i][j - 1];
                if(str1.size() == str2.size())
                    table[i][j] = str1 < str2 ? str2 : str1;
                else
                    table[i][j] = str1.size() < str2.size() ? str2 : str1;
            }
        }
    }
    return table[row][col];
}
void showDiff(string &s1, string &s2, string sub, vector<string> &ret)
{
    cout << "Sub = " << sub << endl;
    int len1 = s1.size();
    int len2 = s1.size();
    for(int i = 0, j = 0; i < len1; i++)
    {
        if(s1[i] != sub[j])
        {
            string str;
            str.push_back(‘-‘);
            str.push_back(s1[i]);
            ret.push_back(str);
        }
        else
            j++;
    }
    for(int i = 0, j = 0; i < len2; i++)
    {
        if(s2[i] != sub[j])
        {
            string str;
            str.push_back(‘+‘);
            str.push_back(s2[i]);
            ret.push_back(str);
        }
        else
            j++;
    }
}

int main()
{
    string str1, str2;
    cin >> str1 >> str2;
    string retSub = LCS(str1, str2);
    vector<string> ret;
    showDiff(str1, str2, retSub, ret);
    vector<string>::iterator iter;
    for(iter = ret.begin(); iter != ret.end(); iter++)
        cout << *iter << endl;
    return 0;
}
时间: 2024-10-27 08:03:50

diff函数的实现——LCS的变种问题的相关文章

动态规划解决杭电OJ1080题——LCS的变种

首先上题目: Human Gene Functions Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 2570    Accepted Submission(s): 1451 Problem Description It is well known that a human gene can be considered as a se

diff()函数

1 diff()是将原来的数据减去移动后的数据. 在numpy和pandas中都能调用. pandas的调用方法: import pandas as pd df = pd.DataFrame( {'a':[1,2,3,4,5], 'b':[6,7,8,9,10], 'c':[11,12,13,14,15]}) print(df) # axis=0或index表示上下移动, periods表示移动的次数,为正时向下移,为负时向上移动. print(df.diff( periods=1, axis=

二、常用函数

(一)读写文件 (1)创建单位矩阵(主对角线元素均为1,其余元素均为0) i5 = eye(5) 注:eye()函数 numpy.eye(N,M=None, k=0, dtype=<type 'float'>) 关注第一个第三个参数就行了 第一个参数:输出方阵(行数=列数)的规模,即行数或列数 第三个参数:默认情况下输出的是对角线全"1",其余全"0"的方阵,如果k为正整数,则在右上方第k条对角线全"1"其余全"0"

Python3NumPy的常用函数

Python3NumPy的常用函数 1. txt文件 (1) 单位矩阵,即主对角线上的元素均为1,其余元素均为0的正方形矩阵. 在NumPy中可以用eye函数创建一个这样的二维数组,我们只需要给定一个参数,用于指定矩阵中1的元素个数. 例如,创建3×3的数组: import numpy as np I2 = np.eye(3) print(I2) [[1. 0. 0.] [0. 1. 0.] [0. 0. 1.]] (2) 使用savetxt函数将数据存储到文件中,当然我们需要指定文件名以及要保

高精度 高分辨率 计时函数 Linux

在优化程序过程中,经常性的要统计时间,尤其是科学计算程序,只有在理解每一个部分占用的时间的基础上,才能做进一步的优化和分析. 但是常规的时间函数精度比较低,对某个函数执行时间的测量可能得到的结果为零,但是循环次数很多的情况下又会占用很大的时间,此处你可能会说可以将其他的地方屏蔽掉来单纯测量某一个函数执行多次的时间,但是这样编译器可能会做一些优化,直接或间接地影响测量的准确性. Linux 环境下 POSIX提供了一个纳秒(ns=10^-9s)级别的测量函数,这样就不会出现因为某个函数的执行时间过

《JavaScript高级程序设计》读书笔记 ---函数

函数函数对任何语言来说都是一个核心的概念.通过函数可以封装任意多条语句,而且可以在任何地方.任何时候调用执行.ECMAScript 中的函数使用function 关键字来声明,后跟一组参数以及函数体.函数的基本语法如下所示: function functionName(arg0, arg1,...,argN) { statements}以下是一个函数示例:function sayHi(name, message) { alert("Hello " + name + ",&qu

集训第五周D题 LCS

Description In a few months the European Currency Union will become a reality. However, to join the club, the Maastricht criteria must be fulfilled, and this is not a trivial task for the countries (maybe except for Luxembourg). To enforce that Germa

MATLAB向量和矩阵的基本操作

矩阵的创建(1) rand(m,n)创建m行n列的随机矩阵(每个元素的值在0到1之间).(2) zeros(m,n)创建m行n列的0矩阵.(3) ones(m,n)创建m行n列的1矩阵(4) eye(m)创建m行m列的对角元素是1,其余元素是0的对角矩阵.(5) randn:产生正态分布的随机数或矩阵的函数 randn:产生均值为0,方差σ^2 = 1,标准差σ = 1的正态分布的随机数或矩阵的函数. 用法: Y = randn(n):返回一个n*n的随机项的矩阵.如果n不是个数量,将返回错误信

第三章 基本概念(下) --《Javascript高级程序设计》

六.语句 6.1 if语句 大多数编程语言中最为常用的一个语句就是if 语句.以下是if 语句的语法:if (condition) statement1 else statement2其中的condition(条件)可以是任意表达式:而且对这个表达式求值的结果不一定是布尔值.ECMAScript 会自动调用Boolean()转换函数将这个表达式的结果转换为一个布尔值.如果对condition求值的结果是true,则执行statement1(语句1),如果对condition 求值的结果是fals