近期,我在网上看了一些动态规划求字符串最长公共子序列的代码。可是无一例外都是处理英文字符串,当处理汉字字符串时。常常会出现乱码或者不对的情况。

我对代码进行了改动。使用wchar_t类型存储字符串,可以正确的处理英文字符串和汉字字符串的最长公共子序列。

代码例如以下:

  1. #include "stdafx.h"
  2. #include <iostream>
  3. #define N 1000
  4. using namespace std;
  5. //str1存储字符串1,str2存储字符串2
  6. wchar_t str1[N],str2[N];
  7. //lcs存储最长公共子序列
  8. wchar_t lcs[N];
  9. //c[i][j]存储str1[1...i]与str2[1...j]的最长公共子序列的长度
  10. int c[N][N];
  11. //flag[i][j]标记是那种子问题
  12. //flag[i][j]==0为str1[i]==str2[j]
  13. //flag[i][j]==1为c[i-1][j]>=s[i][j-1]
  14. //flag[i][j]==-1为c[i-1][j]<s[i][j-1]
  15. int flag[N][N];
  16. //
  17. int getLCSlength(const wchar_t *s1, const wchar_t *s2)
  18. {
  19. int i;
  20. int len1 = wcslen(s1);
  21. int len2 = wcslen(s2);
  22. for(i=1;i<=len1;i++)
  23. c[i][0] = 0;
  24. for(i=0;i<=len2;i++)
  25. c[0][i] = 0;
  26. int j;
  27. for(i=1;i<=len1;i++)
  28. for(j=1;j<=len2;j++)
  29. {
  30. if(s1[i-1]==s2[j-1])
  31. {
  32. c[i][j] = c[i-1][j-1] +1;
  33. flag[i][j] = 0;
  34. }
  35. else if(c[i-1][j]>=c[i][j-1])
  36. {
  37. c[i][j] = c[i-1][j];
  38. flag[i][j] = 1;
  39. }
  40. else
  41. {
  42. c[i][j] = c[i][j-1];
  43. flag[i][j] = -1;
  44. }
  45. }
  46. return c[len1][len2];
  47. }
  48. wchar_t* getLCS(const wchar_t *s1, const wchar_t *s2,int len,wchar_t *lcs)
  49. {
  50. int i = wcslen(s1);
  51. int j = wcslen(s2);
  52. while(i&&j)
  53. {
  54. if(flag[i][j]==0)
  55. {
  56. lcs[--len] = s1[i-1];
  57. i--;
  58. j--;
  59. }
  60. else if(flag[i][j]==1)
  61. i--;
  62. else
  63. j--;
  64. }
  65. return lcs;
  66. }
  67. int main(int argc, wchar_t* argv[])
  68. {
  69. //本函数用来配置地域的信息,设置当前程序使用的本地化信息
  70. setlocale(LC_ALL,"chs");
  71. int cases;
  72. cout<<"请输入案例的个数:"<<endl;
  73. cin>>cases;
  74. while(cases--)
  75. {
  76. int i;
  77. cout<<"请输入字符串1:"<<endl;
  78. wcin>>str1;
  79. cout<<"请输入字符串2:"<<endl;
  80. wcin>>str2;
  81. int lcsLen = getLCSlength(str1,str2);
  82. cout<<"最长公共子序列长度:"<<lcsLen<<endl;
  83. wchar_t *p = getLCS(str1,str2,lcsLen,lcs);
  84. cout<<"最长公共子序列为:"<<endl;
  85. for(i=0;i<lcsLen;i++)
  86. wcout<<lcs[i];
  87. wcout<<endl;
  88. }
  89.  
  90. return 0;
  91. }

C++求解汉字字符串的最长公共子序列 动态规划的更多相关文章

  1. Python-求解两个字符串的最长公共子序列

    一.问题描述 给定两个字符串,求解这两个字符串的最长公共子序列(Longest Common Sequence).比如字符串1:BDCABA:字符串2:ABCBDAB.则这两个字符串的最长公共子序列长 ...

  2. (字符串)最长公共子序列(Longest-Common-Subsequence,LCS)

    问题: 最长公共子序列就是寻找两个给定序列的子序列,该子序列在两个序列中以相同的顺序出现,但是不必要是连续的. 例如序列X=ABCBDAB,Y=BDCABA.序列BCA是X和Y的一个公共子序列,但是不 ...

  3. 【ACM】最长公共子序列 - 动态规划

    最长公共子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 咱们就不拐弯抹角了,如题,需要你做的就是写一个程序,得出最长公共子序列.tip:最长公共子序列也称作最 ...

  4. nyoj 36-最长公共子序列 (动态规划,DP, LCS)

    36-最长公共子序列 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:18 submit:38 题目描述: 咱们就不拐弯抹角了,如题,需要你做的就是写 ...

  5. UVA 11107 Life Forms——(多字符串的最长公共子序列,后缀数组+LCP)

    题意: 输入n个序列,求出一个最大长度的字符串,使得它在超过一半的DNA序列中连续出现.如果有多解,按照字典序从小到大输出所有解. 分析:这道题的关键是将多个字符串连接成一个串,方法是用不同的分隔符把 ...

  6. Atcoder F - LCS (DP-最长公共子序列,输出字符串)

    F - LCS Time Limit: 2 sec / Memory Limit: 1024 MB Score : 100100 points Problem Statement You are gi ...

  7. lintcode:最长公共子序列

    题目 最长公共子序列 给出两个字符串,找到最长公共子序列(LCS),返回LCS的长度. 样例 给出"ABCD" 和 "EDCA",这个LCS是 "A& ...

  8. Lintcode--005(最长公共子序列)

    Given two strings, find the longest common subsequence (LCS).     最长公共子序列 Your code should return th ...

  9. 华为OJ之最长公共子序列

    题目描述: 对于两个给定的字符串,给出他们的最长公共子序列. 题目分析: 1,在之前的博文(http://www.cnblogs.com/yonguo123/p/6711360.html)中我们讨论了 ...

随机推荐

  1. golang struct里面的字段,或者slice排序

    accounts := []users.Account{}Admin.DB.Preload("CurrencyObj").Where("member_id = ?&quo ...

  2. jdbc 接口学习笔记

    一.JDBC概念 JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系型数据库提供统一访问,它由一组用Jav ...

  3. [你必须知道的.NET]目录导航

    http://www.cnblogs.com/anytao/archive/2007/09/14/must_net_catalog.html

  4. .net core2.0 读取appsettings.json

    一.在start.up中添加注入 二.使用

  5. JQuery 遍历没有id的控件

    html代码: <tr> <td field="ck" > <div><input type="checkbox" / ...

  6. 【HTTP】长连接和短连接

    1. HTTP协议与TCP/IP协议的关系 HTTP的长连接和短连接本质上是TCP长连接和短连接.HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议.IP协议主要解决网络路由和寻址问 ...

  7. Android开发笔记(12)——ListView & Adapter

    转载请注明:http://www.cnblogs.com/igoslly/p/6947225.html 下一章是关于ListFragment的内容,首先先介绍ListView的相关配置,理解ListF ...

  8. js-常见简单的js判断方法(暂不参考正则)

    1: 2: 3: 4: 5: 6: 7:

  9. 重新理解 Monad

    对于大多数刚刚入门函数式编程的同学来说,monad(单子.又叫单体)可能是这里面的一道坎.你可能对 map . flatMap 以及 filter 再熟悉不过,可是到了高阶的抽象层次上就又会变得一脸懵 ...

  10. hadoop spark 总结

    yarn  由,资源管理器rm,应用管理器am appMaster,节点管理器nm 组成! 图侵删 yarn 的设计,是为了代替hadoop 1.x的jobtracker 集中式一对多的资源管理「资源 ...