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

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

代码例如以下:

#include "stdafx.h"
#include <iostream>
#define N 1000
using namespace std;
//str1存储字符串1,str2存储字符串2
wchar_t str1[N],str2[N];
//lcs存储最长公共子序列
wchar_t lcs[N];
//c[i][j]存储str1[1...i]与str2[1...j]的最长公共子序列的长度
int c[N][N];
//flag[i][j]标记是那种子问题
//flag[i][j]==0为str1[i]==str2[j]
//flag[i][j]==1为c[i-1][j]>=s[i][j-1]
//flag[i][j]==-1为c[i-1][j]<s[i][j-1]
int flag[N][N];
//
int getLCSlength(const wchar_t *s1, const wchar_t *s2)
{int i;int len1 = wcslen(s1);int len2 = wcslen(s2);for(i=1;i<=len1;i++)c[i][0] = 0;for(i=0;i<=len2;i++)c[0][i] = 0;int j;for(i=1;i<=len1;i++)for(j=1;j<=len2;j++){if(s1[i-1]==s2[j-1]){c[i][j] = c[i-1][j-1] +1;flag[i][j] = 0;}else if(c[i-1][j]>=c[i][j-1]){c[i][j] = c[i-1][j];flag[i][j] = 1;}else{c[i][j] = c[i][j-1];flag[i][j] = -1;}}return c[len1][len2];
}
wchar_t* getLCS(const wchar_t *s1, const wchar_t *s2,int len,wchar_t *lcs)
{int i = wcslen(s1);int j = wcslen(s2);while(i&&j){if(flag[i][j]==0){lcs[--len] = s1[i-1];i--;j--;}else if(flag[i][j]==1)i--;elsej--;}return lcs;
}
int main(int argc, wchar_t* argv[])
{//本函数用来配置地域的信息,设置当前程序使用的本地化信息setlocale(LC_ALL,"chs");int cases;cout<<"请输入案例的个数:"<<endl;cin>>cases;while(cases--){int i;cout<<"请输入字符串1:"<<endl;wcin>>str1;cout<<"请输入字符串2:"<<endl;wcin>>str2;int lcsLen = getLCSlength(str1,str2);cout<<"最长公共子序列长度:"<<lcsLen<<endl;wchar_t *p = getLCS(str1,str2,lcsLen,lcs);cout<<"最长公共子序列为:"<<endl;for(i=0;i<lcsLen;i++)wcout<<lcs[i];wcout<<endl;}return 0;
}

转载于:https://www.cnblogs.com/lxjshuju/p/7079438.html

C++求解汉字字符串的最长公共子序列 动态规划相关推荐

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

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

  2. 两个字符串的最长公共子序列长度_程序员编程算法,解决文本相似度问题的最长公共子序列算法!...

    在前面我讲解了如何通过最长公共子串来求解两个文本的相似度问题,但它有一定缺陷,举个例子,看下面的两个字符串 我爱吃小青菜和各种鲜水果. 我很爱吃青菜与各样水果. 上面两个字符串,如果通过计算子串来求相 ...

  3. python求最长公共子串_Python-求解两个字符串的最长公共子序列

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

  4. 两个字符串的最长公共子序列长度_【面试】动态规划-之最长公共子序列、最长公共子串问题...

    先来说明下什么是最长公共子序列,什么是是最长公共子串,举一个实际例子,myblogs与belong,最长公共子序列为blog(myblogs, belong),最长公共子串为lo(myblogs, b ...

  5. 动态规划:求两个字符串的最长公共子序列

    问题描述:求两个字符串的最长公共子序列. 思路:使用动态规划的思想,将问题分解为小的子问题. 假设两个字符串序列分别为:X{x0, x1, x2,......, xm}, Y{y0, y1, y2,. ...

  6. 最长公共子序列动态规划c语言,动态规划----最长公共子序列(C++实现)

    最长公共子序列 题目描述:给定两个字符串s1 s2 - sn和t1 t2 - tm .求出这两个字符串的最长公共子序列的长度.字符串s1 s2 - sn的子序列指可以表示为 - { i1 < i ...

  7. 最长公共子序列--动态规划(C++)

    动态规划与分治方法类似,都是通过组合子问题来求解原问题.分治法将问题分为互不相交的子问题,递归的求解子问题,再将他们的解组合起来,求出原问题的解.相反的,动态规划用于子问题重叠的情况,即不同的子问题具 ...

  8. 夕拾算法进阶篇:15)最长公共子序列(动态规划DP)

    题目描述 给你一个序列X和另一个序列Z,当Z中的所有元素都在X中存在,并且在X中的下标顺序是严格递增的,那么就把Z叫做X的子序列. 例如:Z=<a,b,f,c>是序列X=<a,b,c ...

  9. 两个字符串的最长公共子序列长度_输出两个字符串的最长公共子串和最长公共子序列...

    输出两个字符串的最长公共子串和最长公共子序列.求解两个字符串的最长公共子串和最长公共子序列在方法上很接近,都是动态规划.只不过在递推方程上有一些不一样. 求两个字符串的最长公共子串 #include ...

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

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

最新文章

  1. html div 隐藏滚动条样式,div滚动条样式隐藏与显示
  2. LeetCode:917. Reverse Only Letters
  3. 华人一作获最佳论文奖,第四大视觉顶会BMVC大奖出炉!
  4. lora发射和接收原理_四个要点,帮你搞定LoRa天线匹配电路
  5. Python中定义函数的三种形式
  6. Delphi编程实现是否开启“平滑屏幕字体边缘“
  7. 使用 HTTP 缓存防止不必要的网络请求
  8. MySQL 数据库崩溃(crash)的常见原因和解决办法---发表到 《数据和云》 公众号
  9. 可任意设置时间的ppt倒计时软件
  10. 嵇少峰:互联网金融草根时代终结
  11. 未完成的IT路停在回车键 2014年末总结篇
  12. vue 全局/局部组件
  13. PLD PLA PAL GAL
  14. VLC控件支持的参数和方法
  15. android 麦克风录音输出
  16. 【原生js】动态添加class
  17. 功能:CO11和CO11N的差异
  18. 利用二极管,三极管,电容,电阻设计一个扩音器
  19. socket服务端同时监听多个端口号
  20. 使用PE全新安装系统

热门文章

  1. hdoj2084:数塔(dp基础题----递归写法/状态转移方程法)
  2. 主梁弹性模量计算_桥梁支座详解全攻略!图文+计算详解,值得收藏!
  3. 极客大学产品经理训练营 产品经理新人如何落地 第0课总结
  4. 算法:二叉树从树叶到根部每层构成的数组队列107. Binary Tree Level Order Traversal II
  5. 算法:First Missing Positive(求缺失的第一个正整数)
  6. 微型计算机中call指令,微机原理 第四章 微型计算机指令系统.ppt
  7. php 查询逗号分隔字符串,PHP-在逗号分隔的字符串mysql中查找值
  8. linux下把 python 程序运行的输出结果记录到 log 文件中
  9. 判断数组中的元素是否连续
  10. matlab仿真之大尺度衰落因子的产生