Swift教室 Swift と競技プログラミングの教室

文字列と文字

読了目安 約2分

String と Character の違い、結合と count、Array で 1 文字ずつ扱う競プロの定石。

この章の目次

"AtCoder" のような文字の並びが文字列でした。 競プロでは文字列を 1 文字ずつ調べる問題が頻出です。

String と Character

Swift の文字列の型は String です。 1 文字だけを表す型は別にあり、Character と書きます。

"S" という書き方はどちらの型にもなれます。 型を書かなければ String になります。

Swift
let s: String = "Swift"
let c: Character = "S"
print(s)
print(c)

Character は 1 文字専用なので、let c: Character = "AB" はコンパイルエラーです。

文字列の結合と文字数

文字列同士は + でつなげられます。 文字数は .count で数えます。

Swift
let hello = "Hello"
let name = "Swift"
let joined = hello + ", " + name + "!"
print(joined)
print(joined.count)
print("\(name)\(name.count) 文字です")

試してみよう: joined をもっと長くして、count がどう変わるか確かめてください。

+ でつなげられるのは文字列同士だけです。 数値を埋め込むときは入力と実行順序の文字列補間を使います。

1 文字ずつ取り出す

for-in 文は文字列にも使えます。 先頭から 1 文字ずつ、Character として取り出されます。

Swift
let s = "abc"
for c in s {
    print(c)
}

番号で文字にアクセスするには

s[0] と書いて先頭の文字を取り出したくなりますが、これはコンパイルエラーです。 絵文字のような複雑な文字も 1 文字と数えるため、内部の区切りが番号と対応していないのです。

そこで競プロでは、先に Array(s) で文字の配列に変換するのが定石です。 配列なら番号でアクセスできます。 配列そのものは次の章で扱います。

Swift
let s = "swift"
let chars = Array(s)
print(chars[0])
print(chars[chars.count - 1])
print(String(chars))

String(chars) で文字列に戻せます。 1 文字の CharacterString(c) で文字列にできます。

学びどころ

概念一言まとめ
String / Character文字列の型と 1 文字の型
+.count結合と文字数
for c in s先頭から 1 文字ずつ取り出す
Array(s)番号でアクセスできる文字の配列にする定石

演習

文字列 S が 1 行で入力されます。 1 行目に S の文字数を、2 行目に S を逆順にした文字列を出力してください。 S は英小文字のみ、1 文字以上 100 文字以下です。

テキスト
入力例:
swift

出力例:
5
tfiws
模範解答
Swift
let s = readLine()!
print(s.count)

var t = ""
for c in s {
    t = String(c) + t
}
print(t)

取り出した文字を毎回先頭に足していくと、最後に逆順の文字列が残ります。 逆順は print(String(s.reversed())) の 1 行でも書けます(標準ライブラリの関数)。