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. Aspose.Words进行Word替换(插入图片和水印)

    由于最近一直在忙着做着Word打印模板的一些工作,就整理一些Asponse.Words对Word文档进行操作的资料. using System; using System.Collections.Ge ...

  2. java线程入门知识

    为什么需要多线程? . 模型的简化,如某些程序是由多个相对独立任务的运行: . 图形界面的出现,输入.输出的阻塞 . 多核CPU的更好利用 . 异步行为的需要 Java多线程的特性: . 程序的入口m ...

  3. layer弹出框的用法

    页面中引入  layer.js 就行了 1.弹出一个提示信息: layer.msg("我是哦提示信息"); 2.弹出一个带选择的按钮的框 layer.open({ title: ' ...

  4. Select, Poll,Epoll

    Date: 2019-06-19 Author: Sun 1. Select ​ select最早于1983年出现在4.2BSD中,它通过一个select()系统调用来监视多个文件描述符的数组,当se ...

  5. SQLServer Oracle MySQL的区别

    table tr:nth-child(odd){ background: #FFFFCC; font-size: 18px; } table tr:nth-child(even){ backgroun ...

  6. django创建第一个子文件夹

    1.首先安装python, 我安装了Python2.7的版本,安装在了D:\Python25\2.接着安装django,我下载了django 1.6的版本.3. 安装完了之后,打开cmd,然后可以检验 ...

  7. IOS与h5交互记录

    博主之前做过移动端app嵌入网页,与Android和IOS有交互,一直没有时间分享过程.这里不多说Android交互啦-很简单,详细了解IOS与h5的交互吧. IOS不同语法和h5的交互所建立的JSB ...

  8. Project Euler 26 Reciprocal cycles( 分数循环节 )

    题意: 单位分数指分子为1的分数.分母为2至10的单位分数的十进制表示如下所示: 1/2 =  0.5 1/3 =  0.(3) 1/4 =  0.25 1/5 =  0.2 1/6 =  0.1(6 ...

  9. javaSE常用的英语单词

    1.continut 使......继续 2.break 打破 3.switch 开关:转换:鞭子 4.case 实例:情况:箱 5.Object 目标:物体 6.Class 阶级:班级:种类 7.p ...

  10. LVM man帮助

    > man lvm LVM(8) System Manager's Manual LVM(8) NAME lvm — LVM2 tools SYNOPSIS lvm [command|file] ...