zoukankan      html  css  js  c++  java
  • [Swift]LeetCode686. 重复叠加字符串匹配 | Repeated String Match

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    ➤微信公众号:山青咏芝(shanqingyongzhi)
    ➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/
    ➤GitHub地址:https://github.com/strengthen/LeetCode
    ➤原文地址: https://www.cnblogs.com/strengthen/p/10500613.html 
    ➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
    ➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

    Given two strings A and B, find the minimum number of times A has to be repeated such that B is a substring of it. If no such solution, return -1.

    For example, with A = "abcd" and B = "cdabcdab".

    Return 3, because by repeating A three times (“abcdabcdabcd”), B is a substring of it; and B is not a substring of A repeated two times ("abcdabcd").

    Note:
    The length of A and B will be between 1 and 10000.


    给定两个字符串 A 和 B, 寻找重复叠加字符串A的最小次数,使得字符串B成为叠加后的字符串A的子串,如果不存在则返回 -1。

    举个例子,A = "abcd",B = "cdabcdab"。

    答案为 3, 因为 A 重复叠加三遍后为 “abcdabcdabcd”,此时 B 是其子串;A 重复叠加两遍后为"abcdabcd",B 并不是其子串。

    注意:

     A 与 B 字符串的长度在1和10000区间范围内。


    16ms

     1 class Solution {
     2   func repeatedStringMatch(_ A: String, _ B: String) -> Int {
     3     var arrA: [UInt32] = []
     4     var arrB: [UInt32] = []
     5     var setA: Set<UInt32> = []
     6     
     7     for char in A.unicodeScalars {
     8       arrA.append(char.value)
     9       setA.insert(char.value)
    10     }
    11     
    12     for char in B.unicodeScalars {
    13       if !setA.contains(char.value) {
    14         return -1
    15       }
    16       arrB.append(char.value)
    17     }
    18     
    19     for i in 0..<arrA.count {
    20       if arrA[i] == arrB[0] {
    21         var times = 1
    22         var indexI = i
    23         var j = 0
    24         while j < arrB.count && arrA[indexI] == arrB[j] {
    25           indexI += 1
    26           j += 1
    27           if j < arrB.count && indexI >= arrA.count {
    28             indexI = 0
    29             times += 1
    30           }
    31         }
    32         
    33         if j == arrB.count {
    34           return times
    35         }
    36       }
    37     }
    38     
    39     return -1
    40   }
    41 }

    24ms

     1 import Foundation
     2 
     3 class Solution {
     4     func repeatedStringMatch(_ A: String, _ B: String) -> Int {
     5         if !Set(B).isSubset(of: Set(A)) {
     6             return -1
     7         }
     8         
     9         var s = String(repeating: A, count: B.count/A.count)
    10         repeat {
    11             if s.contains(B) {
    12                 return s.count/A.count
    13             } else {
    14                 s += A
    15             }
    16         } while (s.count < B.count + 2*A.count)
    17         return -1
    18     }
    19 }

    1372ms

     1 class Solution {
     2     func repeatedStringMatch(_ A: String, _ B: String) -> Int {
     3 
     4         var setA = Set(Array(A))
     5         var setB = Set(Array(B))
     6         
     7         if !setB.isSubset(of:setA) {
     8             return -1
     9         }
    10         
    11         
    12         
    13         var string = A
    14         var count = 1
    15         while string.count < B.count {
    16             string.append(A)
    17             count += 1
    18         }
    19         
    20         if string.contains(B) {
    21             return count
    22         }
    23         
    24         string.append(A)
    25         
    26         if string.contains(B) {
    27             return count + 1
    28         }
    29         
    30         return -1
    31     }
    32 }

    1776ms

     1 class Solution {
     2     func repeatedStringMatch(_ A: String, _ B: String) -> Int {
     3         if A.count == 0 || B.count == 0 {
     4             return -1
     5         }
     6         
     7         var setB = Set(B)
     8         var setA = Set(A)
     9         
    10         if !setB.isSubset(of: setA) {
    11             return -1
    12         }
    13         
    14         var string = A
    15         var count = 1
    16         while string.count < B.count {
    17             string.append(A)
    18             count += 1
    19         }
    20         
    21         if string.contains(B) {
    22             return count
    23         }
    24         
    25         string.append(A)
    26         
    27         if string.contains(B) {
    28             return count + 1
    29         }
    30         
    31         return -1
    32     }
    33 }

    1848ms

     1 class Solution {
     2     func repeatedStringMatch(_ A: String, _ B: String) -> Int {
     3         if A.isEmpty || B.isEmpty {
     4             return 0
     5         }
     6 
     7         let A = Array(A)
     8         let B = Array(B)
     9         var result = Int.max
    10         for start in 0..<A.count {
    11             var c = 0
    12             var i = start
    13             var j = 0
    14             while j < B.count {
    15                 if i == A.count {
    16                     c += 1
    17                     i = 0
    18                 }
    19                 if A[i] != B[j] {
    20                     break
    21                 }
    22                 i += 1
    23                 j += 1
    24             }
    25             if j == B.count {
    26                 result = min(result, c + 1)
    27             }
    28         }
    29         return result == Int.max ? -1 : result
    30     }
    31 }

    Runtime: 2116 ms
    Memory Usage: 19.6 MB
     1 class Solution {
     2     func repeatedStringMatch(_ A: String, _ B: String) -> Int {
     3         var m:Int = A.count
     4         var n:Int = B.count
     5         var arrA:[Character] = Array(A)
     6         var arrB:[Character] = Array(B)
     7         for i in 0..<m
     8         {
     9             var j:Int = 0
    10             while (j < n && arrA[(i + j) % m] == arrB[j])
    11             {
    12                 j += 1
    13             }
    14             if j == n
    15             {
    16                 return (i + j - 1) / m + 1
    17             }
    18         }
    19         return -1
    20     }
    21 }

    2392ms

     1 class Solution {
     2     func repeatedStringMatch(_ A: String, _ B: String) -> Int {
     3         let arrayA = Array(A), arrayB = Array(B)
     4         guard let firstB = arrayB.first else { return -1 }
     5         var indexAs = arrayA.indices.filter { arrayA[$0] == firstB }
     6         guard indexAs.count > 0 else { return -1 }
     7         
     8         var minRepeatCount = -1
     9         for indexA in indexAs {
    10             var indexA = indexA
    11             var repeatCount = 1
    12             for indexB in arrayB.indices {
    13                 if arrayB[indexB] != arrayA[indexA] {
    14                     repeatCount = -1
    15                     break
    16                 }
    17 
    18                 // important
    19                 if indexB == arrayB.count - 1 {
    20                     break
    21                 }
    22 
    23                 if indexA == arrayA.count - 1 {
    24                     repeatCount += 1
    25                     indexA = 0
    26                 } else {
    27                     indexA += 1
    28                 }
    29             }
    30             
    31             if repeatCount != -1 {
    32                 if minRepeatCount == -1 {
    33                     minRepeatCount = repeatCount
    34                 } else {
    35                     minRepeatCount = min(minRepeatCount, repeatCount)
    36                 }
    37             }
    38         }
    39         return minRepeatCount
    40     }
    41 }

    2572ms

     1 class Solution {
     2     func repeatedStringMatch(_ A: String, _ B: String) -> Int {
     3         let aChars = A.unicodeScalars.map { $0.value }
     4         let bChars = B.unicodeScalars.map { $0.value }
     5         guard bChars.count > 0 else {
     6             return -1
     7         }
     8 
     9         var startComparing = false
    10         var i = 0
    11         var j = 0
    12         while true {
    13             if i >= aChars.count, !startComparing {
    14                 break
    15             }
    16             if j >= bChars.count {
    17                 break
    18             }
    19             if aChars[i % aChars.count] != bChars[j] {
    20                 if startComparing {
    21                     startComparing = false
    22                     i -= j
    23                     j = 0
    24                 }
    25                 i += 1
    26                 continue
    27             } else {
    28                 if !startComparing {
    29                     startComparing = true
    30                 }
    31                 i += 1 
    32                 j += 1
    33                 continue
    34             }
    35         }
    36         return startComparing ? Int(ceil(Double(i)/Double(aChars.count))) : -1
    37     }
    38 }

    3956ms

     1 class Solution {
     2     func repeatedStringMatch(_ A: String, _ B: String) -> Int {
     3         if A.isEmpty { return -1 }
     4         if A == B || A.contains(B) { return 1 }
     5         var i = 1
     6         var newString = A
     7         
     8         if Set(A).count != Set(B).count { return -1 }
     9         
    10         var limit = A.count > B.count ? 2 : (B.count / A.count) + 1
    11         
    12         while i <= limit {
    13             i += 1
    14             newString += A
    15             if newString.count >= B.count && newString.range(of: B) != nil {
    16                 return i
    17             }
    18         }
    19         return -1
    20     }
    21 }
  • 相关阅读:
    django orm中filter(条件1).filter(条件2)与filter(条件1,条件2)的区别 哈欠涟涟的日志 网易博客
    提示:ERROR 1044 (42000): Access denied for user
    取消选中的区域
    1.XML复习、HTML DOM 复习 2.simpleXML方式解析XML 3.XPath 4,MVC
    JSP的内置对象(session)
    每月自评之三:2013年3月
    HDU1405:The Last Practice
    一种Playfair密码变种加密方法如下:首先选择一个密钥单词(称为pair)(字母不重复,且都为小写字母),然后与字母表中其他字母一起填入至一个5x5的方阵中,填入方法如下:
    一个经典实用的 IPtables Shell 脚本
    static class 静态类
  • 原文地址:https://www.cnblogs.com/strengthen/p/10500613.html
Copyright © 2011-2022 走看看