判断子序列--动态规划

给定字符串st ,判断 s 是否为 t 的子序列.

你可以认为st 中仅包含英文小写字母. 字符串 t 可能会很长(长度约等于500000), 而 s 是个短字符(长度<= 100).

字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。

示例1:

s = "abc", t = "ahbgdc"

返回 true.

示例2:

s = "axc", t = "ahbgdc"

返回 false

 

解法一: 动态规划

算法思想

当char[i]==char[j]时,则字符i一定是j的子序列,如果0~i-1子字符串是0~j-1子字符串的子序列,则dp[i][j]=true,所以dp[i][j] = dp[i-1][j-1];
当char[i]!=char[i]时,即判断当前0~i子字符串是否是0~j-1的子字符串的子序列,即dp[i][j] = dp[i][j - 1]。如ab,eabc,虽然s的最后一个字符和t中最后一个字符不相等,但是因为ab是eab的子序列,所以ab也是eabc的子序列
初始化:空字符串一定是t的子字符串的子序列,所以dp[0][j]=true

 

swift代码

func isSubsequence(_ s: String, _ t: String) -> Bool {
    guard s.count >= 0, t.count >= 0 else {return false}
    if s.count == 0 {return true}
    if s.count > t.count {return false}
    var dp = [[Bool]]()
    let sArr = Array(s)
    let tArr = Array(t)
    //初始化
    var verArr = [Bool]()
    for _ in 0..<tArr.count {
        verArr.append(true)
    }
    dp.append(verArr)
    for _ in 1..<sArr.count {
        var initArr = [Bool]()
        for j in 0..<t.count {
            if j == 0 {
                initArr.append(false)
            }
        }
        dp.append(initArr)
    }
    print(dp)
    //dp
    for i in 1..<sArr.count{
        for j in 1..<tArr.count{
            if sArr[i - 1] == tArr[j - 1] {
                dp[i].append(dp[i - 1][j - 1])
            } else {
                dp[i].append(dp[i][j - 1])
            }
        }
    }
    return dp[sArr.count - 1][tArr.count - 1]
}

 

上面是动态规划的方式求解,但是超时了,用动态规划思想解决这个问题有点不合适,但是我们主要讲思想!!!

 

posted @ 2019-11-13 19:28  国孩  阅读(569)  评论(0编辑  收藏  举报