この問題では、文字列をジグザグの形に並べて、その結果を読み取るということを求めています。
問題の流れ
1,ジグザグパターンを作る
与えられた文字列を指定された行数でジグザグ状に並べる。
2,ジグザグの並びを読み取る
ジグザグパターンを行ごとに読み取り、1つの文字列として結合する。
具体例
入力:
PAYPALISHIRING (文字列)
numRows = 3 (行数)
まず、この文字列を3行のジグザグパターンで配置します。
最初の文字 P を1行目に置きます。
次の文字 A を2行目に。
次の文字 Y を3行目に。
その次の文字 P を再び2行目に戻ります。
さらに次の文字 A を1行目に戻ります。
こうして「ジグザグの順序」で配置されます。
P A H N
A P L S I I G
Y I R
文字の並び方として,
1, 上から下へ移動(各行に文字を順番に置く)。
2, 一番下の行に到達したら、上へ戻る。
3, 一番上の行に到達したら、再び下に移動する。
となっています.
それではGolangで実装してみます.
package main
func convert(s string, numRows int) string {
if numRows == 1 {
return s
}
rows := make([]string, min(numRows, len(s)))
curRow := 0
goingDown := false
for _, c := range s {
rows[curRow] += string(c)
// 一番上か一番下の行に到達したら方向を変える
if curRow == 0 || curRow == numRows-1 {
goingDown = !goingDown
}
// 一行進む
if goingDown {
curRow++
} else {
curRow--
}
}
result := ""
for _, row := range rows {
result += row
}
return result
}
func min(a, b int) int {
if a < b {
return a
}
return b
}
コードの詳細解説
なぜ min(numRows, len(s)) なのか?
A. numRows が len(s) より大きい場合の最適化
例えば、文字列 s = "ABC" で numRows = 5 の場合を考えてみます。この場合:
実際に必要な行数は、最大でも文字列の長さ len(s) = 3 行です。
文字列が3文字しかないため、5行のうち3行だけ使われ、残りの2行は空になります。