LeetCode -字符串“之”字形轉(zhuǎn)換
前言我們社區(qū)陸續(xù)會將顧毅(Netflix 增長黑客,《iOS 面試之道》作者,ACE 職業(yè)健身教練。微博:@故胤道長[1])的 Swift 算法題題解整理為文字版以方便大家學習與閱讀。
LeetCode 算法到目前我們已經(jīng)更新了 3 期,我們會保持更新時間和進度(周一、周三、周五早上 9:00 發(fā)布),每期的內(nèi)容不多,我們希望大家可以在上班路上閱讀,長久積累會有很大提升。
難度水平:中等
1. 描述
已知一個字符串 “PAYPALISHIRING” 在確定的行數(shù)上以 “之” 字形圖案書寫,如下所示:
- P A H N
- A P L S I I G
- Y I R
然后逐行閱讀獲得一個新的字符串:“PAHNAPLSIIGYIR”
- func convert(s: String, _ numRows: Int) -> String
已知一個字符串和行數(shù),在上述方法內(nèi)編寫轉(zhuǎn)換的代碼。
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)
- }
- }
- 主要思想:第一行和最后一行,循環(huán)長度為 (2 * numRows - 2)對于它們之間的每一行,應該插入另一個數(shù)字,index = index + 2 * (numRows - i - 1)
- 時間復雜度:O(log(n + m))
- 空間復雜度:O(1)
該算法題解的倉庫:LeetCode-Swift[2]
點擊前往 LeetCode[3] 練習
關(guān)于我們公眾號是由 Swift 愛好者共同維護,我們會分享以 Swift 實戰(zhàn)、SwiftUI、Swift 基礎為核心的技術(shù)內(nèi)容,也整理收集優(yōu)秀的學習資料。歡迎關(guān)注公眾號:Swift社區(qū),后臺點擊進群,聯(lián)系我們獲取更多內(nèi)容。
參考資料
[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/