今是昨非

今是昨非

日出江花红胜火,春来江水绿如蓝

アルゴリズム_リバースワーズ

Algorithem_ReverseWords#

文字列内の単語を逆順にする#

与えられた文字列 s に対して、各単語内の文字の順序を逆にし、空白と初期の単語の順序を保ったままにします。

例 1:

Input: s = "Let's take LeetCode contest"
Output: "s'teL ekat edoCteeL tsetnoc"

例 2:

Input: s = "God Ding"
Output: "doG gniD"

解法一#

ロジック:
文字列を空白で分割して配列にし、配列を反復処理し、各文字列に対して reversed メソッドを呼び出し、最後に空白を使用して文字列に結合します。

コードは以下の通りです:


class Solution {
    func reverseWords(_ s: String) -> String {
        let list = s.components(separatedBy: " ")
        var results: [String] = []
        for str in list {
            let reverseStr = String(str.reversed())
            results.append(reverseStr)
        }
        return results.joined(separator: " ")
    }
}

結果は得られますが、TwoPointers アルゴリズムは使用されていません。もう一つの解法は、TwoPointers を使用し、まず文字列を文字の配列に変換し、文字の配列を反復処理し、現在の文字が空白の場合は、空白の前(2 つの空白の間)の要素を交換します。

コードは以下の通りです:


class Solution {
    func reverseWords(_ s: String) -> String {
        var characters = Array(s)
        var start = 0
        var end = 0
        for i in 0..<characters.count {
            let c = characters[i]
            if String(c) == " " {
                // 現在の文字が空白の場合、前のデータを反転させる
                end = i - 1 
                swapList(&characters, start, end)
                start = i + 1
            }
        }
        swapList(&characters, start, characters.count-1)
        return String(characters)
    }
    
    func swapList(_ characters: inout [Character], _ start: Int, _ end: Int) {
        var mutStart = start
        var mutEnd = end
        while mutStart < mutEnd {
            characters.swapAt(mutStart, mutEnd)
            mutStart += 1
            mutEnd -= 1
        }
    }
}

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。