文字列と文字
読了目安 約2分
String と Character の違い、結合と count、Array で 1 文字ずつ扱う競プロの定石。
この章の目次
"AtCoder" のような文字の並びが文字列でした。
競プロでは文字列を 1 文字ずつ調べる問題が頻出です。
String と Character
Swift の文字列の型は String です。
1 文字だけを表す型は別にあり、Character と書きます。
"S" という書き方はどちらの型にもなれます。
型を書かなければ String になります。
let s: String = "Swift"
let c: Character = "S"
print(s)
print(c)Character は 1 文字専用なので、let c: Character = "AB" はコンパイルエラーです。
文字列の結合と文字数
文字列同士は + でつなげられます。
文字数は .count で数えます。
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 として取り出されます。
let s = "abc"
for c in s {
print(c)
}番号で文字にアクセスするには
s[0] と書いて先頭の文字を取り出したくなりますが、これはコンパイルエラーです。
絵文字のような複雑な文字も 1 文字と数えるため、内部の区切りが番号と対応していないのです。
そこで競プロでは、先に Array(s) で文字の配列に変換するのが定石です。
配列なら番号でアクセスできます。
配列そのものは次の章で扱います。
let s = "swift"
let chars = Array(s)
print(chars[0])
print(chars[chars.count - 1])
print(String(chars))String(chars) で文字列に戻せます。
1 文字の Character も String(c) で文字列にできます。
学びどころ
| 概念 | 一言まとめ |
|---|---|
String / Character | 文字列の型と 1 文字の型 |
+ と .count | 結合と文字数 |
for c in s | 先頭から 1 文字ずつ取り出す |
Array(s) | 番号でアクセスできる文字の配列にする定石 |
演習
文字列 S が 1 行で入力されます。 1 行目に S の文字数を、2 行目に S を逆順にした文字列を出力してください。 S は英小文字のみ、1 文字以上 100 文字以下です。
入力例:
swift
出力例:
5
tfiws模範解答
let s = readLine()!
print(s.count)
var t = ""
for c in s {
t = String(c) + t
}
print(t)取り出した文字を毎回先頭に足していくと、最後に逆順の文字列が残ります。
逆順は print(String(s.reversed())) の 1 行でも書けます(標準ライブラリの関数)。