• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

最长公共子序列(Swift版本)

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap