LeetCode -字符串“之”字形轉換
前言我們社區陸續會將顧毅(Netflix 增長黑客,《iOS 面試之道》作者,ACE 職業健身教練。微博:@故胤道長[1])的 Swift 算法題題解整理為文字版以方便大家學習與閱讀。
LeetCode 算法到目前我們已經更新了 3 期,我們會保持更新時間和進度(周一、周三、周五早上 9:00 發布),每期的內容不多,我們希望大家可以在上班路上閱讀,長久積累會有很大提升。
難度水平:中等
1. 描述
已知一個字符串 “PAYPALISHIRING” 在確定的行數上以 “之” 字形圖案書寫,如下所示:
- P A H N
- A P L S I I G
- Y I R
然后逐行閱讀獲得一個新的字符串:“PAHNAPLSIIGYIR”
- func convert(s: String, _ numRows: Int) -> String
已知一個字符串和行數,在上述方法內編寫轉換的代碼。
2. 示例
示例 1
- 輸入:s = "PAYPALISHIRING", numRows = 3
- 輸出: "PAHNAPLSIIGYIR"
- 解釋:
- P A H N
- A P L S I I G
- Y I R
示例 2
- 輸入:s = "PAYPALISHIRING", numRows = 4
- 輸出: "PINALSIGYAHRPI"
- 解釋:
- P I N
- A L S I G
- Y A H R
- P I
示例 3
- 輸入:s = "A", numRows = 1
- 輸出: "A"
約束條件:
- 1 <= s.length <= 1000
- s 英文字母 , 和 .組成。
- 1 <= numRows <= 1000
3. 答案
- class Solution {
- func convert(s: String, _ numRows: Int) -> String {
- if numRows == 1 {
- return s
- }
- var ret: [Character] = []
- var chars: [Character] = [Character](s.characters)
- let cnt = chars.count
- for i in 0..<numRows {
- let len = 2 * numRows - 2
- var index = i
- while index < cnt {
- ret.append(chars[index])
- if i != 0 && i != numRows - 1 {
- let tmpIndex = index + 2 * (numRows - i - 1)
- if tmpIndex < cnt {
- ret.append(chars[tmpIndex])
- }
- }
- index += len
- }
- }
- return String(ret)
- }
- }
- 主要思想:第一行和最后一行,循環長度為 (2 * numRows - 2)對于它們之間的每一行,應該插入另一個數字,index = index + 2 * (numRows - i - 1)
- 時間復雜度:O(log(n + m))
- 空間復雜度:O(1)
該算法題解的倉庫:LeetCode-Swift[2]
點擊前往 LeetCode[3] 練習
關于我們公眾號是由 Swift 愛好者共同維護,我們會分享以 Swift 實戰、SwiftUI、Swift 基礎為核心的技術內容,也整理收集優秀的學習資料。歡迎關注公眾號:Swift社區,后臺點擊進群,聯系我們獲取更多內容。
參考資料
[1]@故胤道長: https://m.weibo.cn/u/1827884772
[2]LeetCode-Swift: https://github.com/soapyigu/LeetCode-Swift
[3]LeetCode: https://leetcode.com/problems/longest-palindromic-substring/























