最长公共子序列(Swift版本)
class Mark {
var count: Int
var type: Int
init(count: Int, type: Int) {
self.count = count
self.type = type
}
}
func findLcs(_ list1: [Character], _ list2: [Character]) -> [Character] {
for c in list1 {
print("list1 = \(c)")
}
for c in list2 {
print("list2 = \(c)")
}
let m = list1.count
let n = list2.count
var marks = [Mark]()
for _ in 1...m*n {
marks.append(Mark(count: 0, type: 0))
}
for i in 0...m-1 {
for j in 0...n-1 {
var mark = marks[i*n + j]
if list1[i] == list2[j] {
mark.type = 2
// print("got a equable")
if i == 0 || j == 0 {
mark.count = 1
} else {
let _mark = marks[(i-1)*n + (j-1)]
mark.count = _mark.count + 1
}
} else {
let mark1 = i > 0 ? marks[(i-1)*n + j] : marks[j]
let mark2 = j > 0 ? marks[i*n + (j-1)] : marks[i*n]
if mark1.count >= mark2.count {
mark.type = 1
mark.count = mark1.count
} else {
mark.count = mark2.count
}
}
}
}
// for mark in marks {
// print("mark's count = \(mark.count), mark's type = \(mark.type)")
// }
var characters = [Character]()
func printLcs(_ list: [Character], _ i: Int, _ j: Int) {
if i < 0 || j < 0 {
return
}
let type = marks[i*n+j].type
if type == 2 {
printLcs(list, i-1, j-1)
characters.append(list[i])
} else if type == 1 {
printLcs(list, i-1, j)
} else {
printLcs(list, i, j-1)
}
}
printLcs(list1, list1.count-1, list2.count-1)
return characters
}
let list1 = "ABCDEF"
let list2 = "BDCEFG"
let characters = findLcs(Array(list1.characters), Array(list2.characters))
for c in characters {
print("\(c)")
}
测试环境:https://swiftlang.ng.bluemix.net/#/repl
最长公共子序列(Swift版本)的更多相关文章
- 用python实现最长公共子序列算法(找到所有最长公共子串)
软件安全的一个小实验,正好复习一下LCS的写法. 实现LCS的算法和算法导论上的方式基本一致,都是先建好两个表,一个存储在(i,j)处当前最长公共子序列长度,另一个存储在(i,j)处的回溯方向. 相对 ...
- LCS最长公共子序列HDU1159
最近一直在学习算法,基本上都是在学习动态规划以及字符串.当然,两者交集最经典之一则是LCS问题. 首先LCS的问题基本上就是在字符串a,b之间找到最长的公共子序列,比如 YAOLONGBLOG 和 Y ...
- python 回溯法 子集树模板 系列 —— 14、最长公共子序列(LCS)
问题 输入 第1行:字符串A 第2行:字符串B (A,B的长度 <= 1000) 输出 输出最长的子序列,如果有多个,随意输出1个. 输入示例 belong cnblogs 输出示例 blog ...
- 【转】最长公共子序列(LCS),求LCS长度和打印输出LCS
求LCS的长度,Java版本: public static int LCS(int[]a,int[] b) { int [][]c=new int[a.length+1][b.length+1]; f ...
- 【线型DP模板】最上上升子序列(LIS),最长公共子序列(LCS),最长公共上升子序列(LCIS)
BEGIN LIS: 一个数的序列bi,当b1 < b2 < … < bS的时候,我们称这个序列是上升的.对于给定的一个序列(a1, a2, …, aN),我们可以得到一些上升的子序 ...
- 从最长公共子序列问题理解动态规划算法(DP)
一.动态规划(Dynamic Programming) 动态规划方法通常用于求解最优化问题.我们希望找到一个解使其取得最优值,而不是所有最优解,可能有多个解都达到最优值. 二.什么问题适合DP解法 如 ...
- 动态规划之最长公共子序列(LCS)
转自:http://segmentfault.com/blog/exploring/ LCS 问题描述 定义: 一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 ...
- [Data Structure] LCSs——最长公共子序列和最长公共子串
1. 什么是 LCSs? 什么是 LCSs? 好多博友看到这几个字母可能比较困惑,因为这是我自己对两个常见问题的统称,它们分别为最长公共子序列问题(Longest-Common-Subsequence ...
- 动态规划求最长公共子序列(Longest Common Subsequence, LCS)
1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...
- LintCode 77: 最长公共子序列
public class Solution { /** * @param A, B: Two string. * @return: the length of the longest common s ...
随机推荐
- Kaggle爆文:一个框架解决几乎所有机器学习问题
上周一个叫 Abhishek Thakur 的数据科学家,在他的 Linkedin 发表了一篇文章 Approaching (Almost) Any Machine Learning Proble ...
- wolf
package com.wh.Demo50; /** * @author 王恒 * @datetime 2017年4月7日 下午4:40:54 * @description * 分析:子类重写父类的方 ...
- Linux下实现视频读取
V4L(video4linux是一些视频系统,视频软件.音频软件的基础,经常时候在需要采集图像的场合,如视频监控,webcam,可视电话,经常使用在embedded linux中是linux嵌入式开发 ...
- sql_2
编辑表结构ALTER TABLE `sp_account_trans` MODIFY COLUMN `TRANS_DESC` varchar(81) CHARACTER SET utf8 CO ...
- 面试官:精通 Mybatis?请回答下这几个问题
点关注,不迷路:持续更新Java架构相关技术及资讯热文!!! Mybatis是现在非常主流的持久层框架,虽然平时用的多,但是其中几个细节的问题,能说出个所以然来不? 一.最常见,参数中 #{} 和 $ ...
- JS 20180416作业
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 关于配置websocket,nginx转发https至wss问题
在本地测试通过的socket,再放到现在的有nginx代理之后发现会报:failed: Error in connection establishment: net::ERR_NAME_NOT_RES ...
- python面向对象三大特性之一封装
一.什么是封装 在程序设计中,封装(Encapsulation)是对具体对象的一种抽象,即将某些部分隐藏起来,在程序外部看不到,其 含义是其他程序无法调用. 要了解封装,离不开“私有化”,就是将类或者 ...
- 原生ajax的get和post方法封装
get 方法 function serialize (data) { if (!data) { return ''; } var paris = []; for (var key in data) { ...
- 03.IO读写-1.IO介绍
1 文件操作介绍 in: 输入,读入.从硬盘中读到内存 out: 输出.从内存写到硬盘 文件的作用: 数据存储 2 文件的打开与关闭 2.1 打开文件 在Python,使用open函数,可以打开一个已 ...