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版本)的更多相关文章

  1. 用python实现最长公共子序列算法(找到所有最长公共子串)

    软件安全的一个小实验,正好复习一下LCS的写法. 实现LCS的算法和算法导论上的方式基本一致,都是先建好两个表,一个存储在(i,j)处当前最长公共子序列长度,另一个存储在(i,j)处的回溯方向. 相对 ...

  2. LCS最长公共子序列HDU1159

    最近一直在学习算法,基本上都是在学习动态规划以及字符串.当然,两者交集最经典之一则是LCS问题. 首先LCS的问题基本上就是在字符串a,b之间找到最长的公共子序列,比如 YAOLONGBLOG 和 Y ...

  3. python 回溯法 子集树模板 系列 —— 14、最长公共子序列(LCS)

    问题 输入 第1行:字符串A 第2行:字符串B (A,B的长度 <= 1000) 输出 输出最长的子序列,如果有多个,随意输出1个. 输入示例 belong cnblogs 输出示例 blog ...

  4. 【转】最长公共子序列(LCS),求LCS长度和打印输出LCS

    求LCS的长度,Java版本: public static int LCS(int[]a,int[] b) { int [][]c=new int[a.length+1][b.length+1]; f ...

  5. 【线型DP模板】最上上升子序列(LIS),最长公共子序列(LCS),最长公共上升子序列(LCIS)

    BEGIN LIS: 一个数的序列bi,当b1 < b2 < … < bS的时候,我们称这个序列是上升的.对于给定的一个序列(a1, a2, …, aN),我们可以得到一些上升的子序 ...

  6. 从最长公共子序列问题理解动态规划算法(DP)

    一.动态规划(Dynamic Programming) 动态规划方法通常用于求解最优化问题.我们希望找到一个解使其取得最优值,而不是所有最优解,可能有多个解都达到最优值. 二.什么问题适合DP解法 如 ...

  7. 动态规划之最长公共子序列(LCS)

    转自:http://segmentfault.com/blog/exploring/ LCS 问题描述 定义: 一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 ...

  8. [Data Structure] LCSs——最长公共子序列和最长公共子串

    1. 什么是 LCSs? 什么是 LCSs? 好多博友看到这几个字母可能比较困惑,因为这是我自己对两个常见问题的统称,它们分别为最长公共子序列问题(Longest-Common-Subsequence ...

  9. 动态规划求最长公共子序列(Longest Common Subsequence, LCS)

    1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...

  10. LintCode 77: 最长公共子序列

    public class Solution { /** * @param A, B: Two string. * @return: the length of the longest common s ...

随机推荐

  1. HDU1412 {A} + {B}

    2019-05-17 10:15:01 每个元素之间有一个空格隔开. 每行最后一的元素后面没有空格,区别于HDU人见人爱A - B 注意使用STL的时候要清空 .  a.clear(); #inclu ...

  2. BZOJ 4262 线段树+期望

    思路: 把询问离线下来,查询max和查询min相似,现在只考虑查询max 令sum[l,r,x]表示l到r内的数为左端点,x为右端点的区间询问的答案 那么询问就是sun[l1,r1,r2]-sum[l ...

  3. Svn install and use

    1.安装服务 使用yum安装subversion,简单.不繁琐. 1 yum install -y subversion 2.创建版本库 1 2       mkidr /svn/obj        ...

  4. Android View事件分发与传递

    在Android中,人们主要通过手指与系统交互.Android把所有的touch事件都被封装成MotionEvent来进行处理,其中包括了手指点击的位置,时间等信息.其事件类型主要包括:ACTION_ ...

  5. 【Oracle】创建角色

    任务:创建角色 1)创建角色sse_role,授予create session 权限 2)创建角色tblo_role,授予CREATE PROCEDURE, CREATE SEQUENCE, CREA ...

  6. PostgreSQL 满足条件时插入数据

    例如:当表中不存在某记录时,才插入这条记录. INSERT INTO 表名(列名1, 列名2) SELECT '值1', '值2' WHERE NOT EXISTS ( SELECT * FROM 表 ...

  7. 『转』The Beginning of your Design Career

    想想,如果明天我开始学日语,坚持到毕业,其实也可以日语入门了.所以机会都是抓住,当初,也就是去年的时候,我那个时候就开始坚持日语入门,想想现在应该可以开始N2了吧-所以...过去不去理会,现在开始继续 ...

  8. bootstrap初用新得2

    ##具体实现 1. 宽度无限的背景和始终居中的主题内容:   首先是背景要用一个div1来做out-background,然后div1的兄弟元素div2来做container.对out-backgro ...

  9. Linux 命令查询系统负载信息

    linux uptime命令主要用于获取主机运行时间和查询linux系统负载等信息.uptime命令过去只显示系统运行多久.现在,可以显示系统已经运行了多长 时间,信息显示依次为:现在时间.系统已经运 ...

  10. 判断list数组里的json对象有无重复,有则去重留1个

    查找有无重复的 var personLength = [{ certType: '2015-10-12', certCode:'Apple'}, { certType: '2015-10-12', c ...