Two ways to solve the "Longest common subsequence" problem
来源:互联网 发布:知乎2018校园招聘 编辑:程序博客网 时间:2024/06/04 20:06
namespace v1 { template <typename CHAR> std::basic_string<CHAR> lcs(const CHAR * s1, const CHAR * s2) { typedef std::basic_string<CHAR> String; String ret; int m = s1 != NULL ? static_cast<int>(strlen(s1)) : 0; int n = s2 != NULL ? static_cast<int>(strlen(s2)) : 0; if (m > 0 && n > 0) { std::vector<std::vector<String>> cache(m + 1, std::vector<String>(n + 1)); for (int i = m - 1; i >= 0; --i) { for (int j = n - 1; j >= 0; --j) { String r1 = cache[i + 1][j]; String r2 = cache[i][j + 1]; String r3; String * pr = r1.length() >= r2.length() ? &r1 : &r2; if (s1[i] == s2[j]) { r3.push_back(s1[i]); r3 += cache[i + 1][j + 1]; if (pr->length() < r3.length()) { pr = &r3; } } cache[i][j] = std::move(*pr); } } ret.swap(cache[0][0]); } return std::move(ret); } }
namespace v2 { namespace details { struct record { int length; short row_increment; short column_increment; }; template <typename CHAR> std::basic_string<CHAR> get_string(const CHAR * s1, const CHAR * s2, std::vector<std::vector<record>> const & cache) { std::basic_string<CHAR> ret; for (int i = 0, j = 0; ; ) { const record & r = cache[i][j]; if (r.row_increment != 0 || r.column_increment != 0) { if (r.row_increment == 1 && r.column_increment == 1) { ret.push_back(s1[i]); } i += r.row_increment; j += r.column_increment; } else { break; } } return std::move(ret); } } template <typename CHAR> std::basic_string<CHAR> lcs(const CHAR * s1, const CHAR * s2) { typedef std::basic_string<CHAR> String; String ret; int m = s1 != NULL ? static_cast<int>(strlen(s1)) : 0; int n = s2 != NULL ? static_cast<int>(strlen(s2)) : 0; if (m > 0 && n > 0) { std::vector<std::vector<details::record>> cache(m + 1, std::vector<details::record>(n + 1, details::record{0, 0, 0})); for (int i = m - 1; i >= 0; --i) { for (int j = n - 1; j >= 0; --j) { details::record r1 = { cache[i + 1][j].length, 1, 0 }; details::record r2 = { cache[i][j + 1].length, 0, 1 }; details::record r3 = { cache[i + 1][j + 1].length + 1, 1, 1 }; details::record * pr = r1.length >= r2.length ? &r1 : &r2; if (s1[i] == s2[j]) { if (pr->length < r3.length) { pr = &r3; } } cache[i][j] = *pr; } } ret.swap(details::get_string(s1, s2, cache)); } return std::move(ret); } }
0 0
- Two ways to solve the "Longest common subsequence" problem
- Three ways to solve the "Longest Palindromic Substring" problem
- Longest common subsequence problem (最长公共字串)
- SRM 437 TheBeauty (three ways to solve this problem)
- how to solve the problem we met?
- How to solve the Candy problem?
- Longest common subsequence problem and poj 1159 Palindrome
- 最长子序列(Longest-Common-Subsequence Problem)
- 最长公共子序列问题 Longest Common Subsequence problem
- longest common subsequence
- Longest Common Subsequence
- 10405 Longest Common Subsequence
- UVa10405 - Longest Common Subsequence
- 10405 - Longest Common Subsequence
- UVa10405 - Longest Common Subsequence
- UVaOJ10405 - Longest Common Subsequence
- 10405 - Longest Common Subsequence
- uva10405 Longest Common Subsequence
- Iintellij Idea中项目引入library的方法
- USER_INDEXES视图剖析
- MVC 控制器向View传值的三种方法
- 写给自己----祭奠我逝去的青春
- 四种隔离级别
- Two ways to solve the "Longest common subsequence" problem
- linux - vi/vim编辑器-高级用法
- HttpClient的一些工具类
- vs2012打包部署时“cannot extract icon with index 0 from file xxx.exe”的解决方案
- 利用python的sklearn开源包进行文本挖掘
- BZOJ 2506 calc
- Struts2 详解
- 解决Hessian【hessian-4.0.7.jar】不能正确传输BigDecimal问题
- ios block回调的理解和总结