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

  1. #include <iostream>
  2. #include <cstring>
  3. #include <vector>
  4. using namespace std;
  5.  
  6. string LCS(string &s1, string &s2)
  7. {
  8. int row = s1.size();
  9. int col = s2.size();
  10. string table[row + ][col + ];
  11. char rowChar[row + ];
  12. char colChar[col + ];
  13. int cnt = ;
  14. rowChar[] = colChar[] = '\0';
  15. for(int i = row - , cnt = ; i >= ; i--, cnt++)
  16. {
  17. rowChar[cnt] = s1[i];
  18. }
  19. for(int i = col - , cnt = ; i >= ; i--, cnt++)
  20. {
  21. colChar[cnt] = s2[i];
  22. }
  23. char ch1, ch2;
  24. string str1, str2;
  25. for(int i = ; i <= row; i++)
  26. {
  27. for(int j = ; j <= col; j++)
  28. {
  29. ch1 = rowChar[i];
  30. ch2 = colChar[j];
  31. if(ch1 == ch2)
  32. table[i][j] = ch1 + table[i - ][j - ];
  33. else
  34. {
  35. str1 = table[i - ][j];
  36. str2 = table[i][j - ];
  37. if(str1.size() == str2.size())
  38. table[i][j] = str1 < str2 ? str2 : str1;
  39. else
  40. table[i][j] = str1.size() < str2.size() ? str2 : str1;
  41. }
  42. }
  43. }
  44. return table[row][col];
  45. }
  46. void showDiff(string &s1, string &s2, string sub, vector<string> &ret)
  47. {
  48. cout << "Sub = " << sub << endl;
  49. int len1 = s1.size();
  50. int len2 = s1.size();
  51. for(int i = , j = ; i < len1; i++)
  52. {
  53. if(s1[i] != sub[j])
  54. {
  55. string str;
  56. str.push_back('-');
  57. str.push_back(s1[i]);
  58. ret.push_back(str);
  59. }
  60. else
  61. j++;
  62. }
  63. for(int i = , j = ; i < len2; i++)
  64. {
  65. if(s2[i] != sub[j])
  66. {
  67. string str;
  68. str.push_back('+');
  69. str.push_back(s2[i]);
  70. ret.push_back(str);
  71. }
  72. else
  73. j++;
  74. }
  75. }
  76.  
  77. int main()
  78. {
  79. string str1, str2;
  80. cin >> str1 >> str2;
  81. string retSub = LCS(str1, str2);
  82. vector<string> ret;
  83. showDiff(str1, str2, retSub, ret);
  84. vector<string>::iterator iter;
  85. for(iter = ret.begin(); iter != ret.end(); iter++)
  86. cout << *iter << endl;
  87. return ;
  88. }

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

  1. np.diff函数

    np.diff函数 觉得有用的话,欢迎一起讨论相互学习~Follow Me 数组中a[n]-a[n-1] import numpy as np a=np.array([1, 6, 7, 8, 12]) ...

  2. SAS笔记(3) LAG和DIFF函数

    在实际的应用中,我们会想查看当前观测的上一个观测值,在上一篇博客中我们使用了RETAIN语句来记录上一条观测,其实SAS还提供了一个很好用的函数LAG.当我们使用函数时,一定要明确该函数的返回值是什么 ...

  3. pandas dataframe 时间字段 diff 函数

    pandas pandas 是数据处理的利器,非常方便进行表格数据处理,用过的人应该都很清楚,没接触的可以自行查阅pandas 官网. 需求介绍 最近在使用 pandas 的过程中碰到一个问题,需要计 ...

  4. diff函数(matlab)

    diff函数式用于求导数和差分的.无论是求导数还是差分,其原理是一样的. 这里简单介绍下其用法: 前后相邻元素之差 上下相邻行之差. 与diff(A,1,1)类似. 第三个参数为2时,则变为列差分运算 ...

  5. diff()函数的使用

    1.diff():返回略微迭代(lagged)的或滞后的不同(iterated diferences). > x<-cumsum(cumsum(1:10)) > x [1] 1 4 ...

  6. matlab的diff()函数

    diff():求差分 一阶差分 X = [1 1 2 3 5 8 13 21]; Y = diff(X) 结果: Y = 0 1 1 2 3 5 8 X = [1 1 1; 5 5 5; 25 25 ...

  7. diff()函数

    1 diff()是将原来的数据减去移动后的数据. 在numpy和pandas中都能调用. pandas的调用方法: import pandas as pd df = pd.DataFrame( {'a ...

  8. 数组单调性判断以及all和diff函数的用法

    clc;clear all;close all; n = 1 ;x = zeros(100,1);while n~= 0 n = input('请输入向量的长度n(0退出程序):'); for i = ...

  9. pandas常用函数之diff

    diff函数是用来将数据进行某种移动之后与原数据进行比较得出的差异数据,举个例子,现在有一个DataFrame类型的数据df,如下: index value1 A 0 B 1 C 2 D 3 如果执行 ...

随机推荐

  1. 2D游戏编程2--windows高级编程

      windows应用程序布局 编译流程 响应菜单事件消息 菜单消息处理实例: LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wpar ...

  2. Ubuntu 下安装Kibana和logstash

    原文地址:http://www.cnblogs.com/saintaxl/p/3946667.html 简单来讲他具体的工作流程就是 logstash agent 监控并过滤日志,将过滤后的日志内容发 ...

  3. 我的第一篇Markdown博客

    我的第一篇Markdown博客 这是我第一次用Markdown写博客,发现还是比较好用的,加上Marsedit也支持了Markdown的博客预览,博客园也加了Markdown的格式支持,就更加方便了, ...

  4. attribute section的用法

    1. gcc的__attribute__编译属性 要了解Linux Kernel代码的分段信息,需要了解一下gcc的__attribute__的编绎属性,__attribute__主要用于改变所声明或 ...

  5. 天涯html&css基础框架

    html申明 对ie6-8在html中添加no-css3这个class和各个版本的class,对ie7以下添加lte7这个class,然后根据我们目前使用浏览器的比例,把第一的ie6放在判断第一位. ...

  6. ThinkPHP 快速入门

    1. 框架简介 框架是程序结构代码的集合,而不是业务逻辑代码.集合中包含了很多类.函数和功能类包.这个集合是按照一定标准组成的功能体系.体系有很多设计模式,比如MVC等. 2. ThinkPHP框架学 ...

  7. 搜索(DFS)

    不知道为什么~除了我室友其他的同学都觉得DFS很简单~且比BFS容易得多........我真心不觉得啊T T~我真心觉得BFS比DFS简单得多................= = 为了把DFS完全搞 ...

  8. 加速 Gradle 构建大型 Android 项目的方法[转]

    加速 Gradle 构建大型 Android 项目的方法 时间 2016-03-14 20:38:00  Mystra 原文  http://www.wangchenlong.org/2016/03/ ...

  9. 理解asp.net中DropDownList编辑数据源,绑定数据库数据。

    一.理解asp.net绑定数据库 终于学习到了连接数据库部分的内容,杨中科老师视频看起来挺轻松的,如果是高清版就更ok了. 我发现我学习新的编程语言会有一个特点,都想要赶紧学习数据库,数据就是一切,有 ...

  10. (转)关闭WordPress自动加载的Open Sans字体,总是连接googleapi.com,导致打开wordpress很慢

    转自http://www.xuanfengge.com/turn-off-automatic-loading-wordpress-open-sans-fonts.html 一.'在网上搜了一番,有四种 ...