zoukankan      html  css  js  c++  java
  • [Swift]LeetCode392. 判断子序列 | Is Subsequence

    原文地址:https://www.cnblogs.com/strengthen/p/10299618.html 

    Given a string s and a string t, check if s is subsequence of t.

    You may assume that there is only lower case English letters in both s and t. t is potentially a very long (length ~= 500,000) string, and s is a short string (<=100).

    A subsequence of a string is a new string which is formed from the original string by deleting some (can be none) of the characters without disturbing the relative positions of the remaining characters. (ie, "ace" is a subsequence of "abcde" while "aec" is not).

    Example 1:
    s = "abc", t = "ahbgdc"

    Return true.

    Example 2:
    s = "axc", t = "ahbgdc"

    Return false.

    Follow up:
    If there are lots of incoming S, say S1, S2, ... , Sk where k >= 1B, and you want to check one by one to see if T has its subsequence. In this scenario, how would you change your code? 


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

    你可以认为 s 和 t 中仅包含英文小写字母。字符串 t 可能会很长(长度 ~= 500,000),而 s 是个短字符串(长度 <=100)。

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

    示例 1:
    s = "abc", t = "ahbgdc"

    返回 true.

    示例 2:
    s = "axc", t = "ahbgdc"

    返回 false.

    后续挑战 :

    如果有大量输入的 S,称作S1, S2, ... , Sk 其中 k >= 10亿,你需要依次检查它们是否为 T 的子序列。在这种情况下,你会怎样改变代码?


    Runtime: 132 ms
    Memory Usage: 25.1 MB
     1 class Solution {
     2     func isSubsequence(_ s: String, _ t: String) -> Bool {
     3         if s == "" { return true }
     4         else if t == "" { return false }
     5         
     6         var arrayS = [Character](s)
     7         var arrayT = [Character](t)
     8         
     9         func helper(arrayS: [Character], arrayT: [Character], startS: Int, startT: Int) -> Bool {
    10             
    11             for i in startT ..< arrayT.count {
    12                 if arrayS[startS] == arrayT[i] {
    13                     if startS == arrayS.count - 1 {
    14                         return true
    15                     } else {
    16                         return helper(arrayS: arrayS, arrayT: arrayT, startS: startS + 1, startT: i + 1)    
    17                     }
    18                 }
    19             }
    20             return false
    21         }
    22         return helper(arrayS: arrayS, arrayT: arrayT, startS: 0, startT: 0)    
    23         
    24     }
    25 }

    144ms

     1 class Solution {
     2     func isSubsequence(_ s: String, _ t: String) -> Bool {
     3         var i = 0
     4         var longstr = Array(t)
     5         for char in s {
     6             while i < longstr.count && longstr[i] != char {
     7                 i += 1
     8             }
     9             
    10             if i >= longstr.count {
    11                 return false
    12             }
    13             i += 1
    14         }
    15         return true
    16     }
    17 }

    156ms

     1 class Solution {
     2     func isSubsequence(_ s: String, _ t: String) -> Bool {
     3         guard s.count <= t.count else { return false }
     4         
     5         let arrS = Array(s)
     6         let arrT = Array(t)
     7         
     8         var i = 0;
     9         var j = 0;
    10         
    11         while i < arrS.count && j < arrT.count {
    12             if arrS[i] == arrT[j] {
    13                 i += 1
    14                 j += 1
    15             } else {
    16                 j += 1
    17             }
    18         }
    19         
    20         return i == arrS.count
    21     }
    22 }

    160ms

     1 class Solution {
     2     func isSubsequence(_ s: String, _ t: String) -> Bool {
     3         let arrS = Array(s)
     4         let arrT = Array(t)
     5 
     6         var sum = 0
     7         var lastj = 0
     8         for i in 0..<arrS.count {
     9             for j in lastj..<arrT.count {
    10                 if arrS[i] == arrT[j] {
    11                     lastj = j+1
    12                     sum += 1
    13                     break
    14                 }
    15             }
    16             if sum <= i {
    17                 return false
    18             }
    19         }
    20         return sum == arrS.count
    21     }
    22 }

    164ms

     1 class Solution {
     2     func isSubsequence(_ s: String, _ t: String) -> Bool {
     3         guard s != "" else { return true }
     4         var i = 0
     5         var j = 0
     6         let s = Array(s)
     7         let t = Array(t)
     8         while i < s.count, j < t.count {
     9             if s[i] == t[j] {
    10                 i += 1
    11             }
    12             j += 1
    13         }
    14         return i == s.count
    15     }    
    16 }

    192ms

     1 class Solution {
     2     func isSubsequence(_ s: String, _ t: String) -> Bool {
     3         return isSubsequenceIteration(s, t)
     4     }
     5     
     6     func isSubsequenceIteration(_ s: String, _ t: String) -> Bool {
     7         guard !s.isEmpty else { return true }
     8         guard !t.isEmpty else { return false }
     9         
    10         let sArray = Array(s)
    11         let tArray = Array(t)
    12         
    13         var hash = [String:Int]()
    14         var current = 0
    15         
    16         for character in tArray {
    17             if sArray[current] == character {
    18                 current += 1
    19                 if current == sArray.count {
    20                     return true
    21                 }
    22             }
    23         }
    24         
    25         return false
    26     }
    27 }

    232ms

     1 class Solution {
     2     func isSubsequence(_ s: String, _ t: String) -> Bool {
     3         if s.isEmpty {
     4             return true
     5         }
     6         var result = false
     7         var sIx = s.startIndex
     8         var sCh = s[sIx]
     9         for tCh in t {
    10             if tCh == sCh {
    11                 // found it, go to next char
    12                 sIx = s.index(after: sIx)
    13                 if sIx == s.endIndex {
    14                     //found them all
    15                     result = true  
    16                     //no need to keep going
    17                     break 
    18                 }
    19                 sCh = s[sIx]
    20             }
    21         }
    22         return result
    23     }
    24 }

    460ms

     1 class Solution {
     2     func isSubsequence(_ s: String, _ t: String) -> Bool {
     3         var s = Array(s)
     4         s.reverse()
     5         var t = Array(t)
     6         t.reverse()
     7         while (s.count > 0 && t.count > 0) {
     8             var sLast = s[s.count-1]
     9             var tLast = t[t.count-1]
    10             if sLast == tLast{
    11                 s.removeLast()
    12             }
    13             t.removeLast()
    14         }
    15         return s.count == 0
    16     }
    17 }
  • 相关阅读:
    几种常见的content-type
    node简单起服务
    ESlint配置案例及如何配置
    网络攻防学习心得一(20159320)工具学习
    网络攻防学习心得一(20159320)黑客信息
    题解 POJ1187 【陨石的秘密】
    题解 POJ1934 【Trip】
    题解 POJ1952 【BUY LOW, BUY LOWER】
    TIM bug 总结以及应对方案
    题解 POJ3171 【Cleaning Shifts】
  • 原文地址:https://www.cnblogs.com/strengthen/p/10299618.html
Copyright © 2011-2022 走看看