C++求解汉字字符串的最长公共子序列 动态规划
近期,我在网上看了一些动态规划求字符串最长公共子序列的代码。可是无一例外都是处理英文字符串,当处理汉字字符串时。常常会出现乱码或者不对的情况。
我对代码进行了改动。使用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--;
- else
- j--;
- }
- 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;
- }
C++求解汉字字符串的最长公共子序列 动态规划的更多相关文章
- Python-求解两个字符串的最长公共子序列
一.问题描述 给定两个字符串,求解这两个字符串的最长公共子序列(Longest Common Sequence).比如字符串1:BDCABA:字符串2:ABCBDAB.则这两个字符串的最长公共子序列长 ...
- (字符串)最长公共子序列(Longest-Common-Subsequence,LCS)
问题: 最长公共子序列就是寻找两个给定序列的子序列,该子序列在两个序列中以相同的顺序出现,但是不必要是连续的. 例如序列X=ABCBDAB,Y=BDCABA.序列BCA是X和Y的一个公共子序列,但是不 ...
- 【ACM】最长公共子序列 - 动态规划
最长公共子序列 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 咱们就不拐弯抹角了,如题,需要你做的就是写一个程序,得出最长公共子序列.tip:最长公共子序列也称作最 ...
- nyoj 36-最长公共子序列 (动态规划,DP, LCS)
36-最长公共子序列 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:18 submit:38 题目描述: 咱们就不拐弯抹角了,如题,需要你做的就是写 ...
- UVA 11107 Life Forms——(多字符串的最长公共子序列,后缀数组+LCP)
题意: 输入n个序列,求出一个最大长度的字符串,使得它在超过一半的DNA序列中连续出现.如果有多解,按照字典序从小到大输出所有解. 分析:这道题的关键是将多个字符串连接成一个串,方法是用不同的分隔符把 ...
- Atcoder F - LCS (DP-最长公共子序列,输出字符串)
F - LCS Time Limit: 2 sec / Memory Limit: 1024 MB Score : 100100 points Problem Statement You are gi ...
- lintcode:最长公共子序列
题目 最长公共子序列 给出两个字符串,找到最长公共子序列(LCS),返回LCS的长度. 样例 给出"ABCD" 和 "EDCA",这个LCS是 "A& ...
- Lintcode--005(最长公共子序列)
Given two strings, find the longest common subsequence (LCS). 最长公共子序列 Your code should return th ...
- 华为OJ之最长公共子序列
题目描述: 对于两个给定的字符串,给出他们的最长公共子序列. 题目分析: 1,在之前的博文(http://www.cnblogs.com/yonguo123/p/6711360.html)中我们讨论了 ...
随机推荐
- golang struct里面的字段,或者slice排序
accounts := []users.Account{}Admin.DB.Preload("CurrencyObj").Where("member_id = ?&quo ...
- jdbc 接口学习笔记
一.JDBC概念 JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系型数据库提供统一访问,它由一组用Jav ...
- [你必须知道的.NET]目录导航
http://www.cnblogs.com/anytao/archive/2007/09/14/must_net_catalog.html
- .net core2.0 读取appsettings.json
一.在start.up中添加注入 二.使用
- JQuery 遍历没有id的控件
html代码: <tr> <td field="ck" > <div><input type="checkbox" / ...
- 【HTTP】长连接和短连接
1. HTTP协议与TCP/IP协议的关系 HTTP的长连接和短连接本质上是TCP长连接和短连接.HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议.IP协议主要解决网络路由和寻址问 ...
- Android开发笔记(12)——ListView & Adapter
转载请注明:http://www.cnblogs.com/igoslly/p/6947225.html 下一章是关于ListFragment的内容,首先先介绍ListView的相关配置,理解ListF ...
- js-常见简单的js判断方法(暂不参考正则)
1: 2: 3: 4: 5: 6: 7:
- 重新理解 Monad
对于大多数刚刚入门函数式编程的同学来说,monad(单子.又叫单体)可能是这里面的一道坎.你可能对 map . flatMap 以及 filter 再熟悉不过,可是到了高阶的抽象层次上就又会变得一脸懵 ...
- hadoop spark 总结
yarn 由,资源管理器rm,应用管理器am appMaster,节点管理器nm 组成! 图侵删 yarn 的设计,是为了代替hadoop 1.x的jobtracker 集中式一对多的资源管理「资源 ...