問題
英大文字・英小文字からなる空でない文字列 が与えられる。 この が以下の条件を満たしているか判定せよ。
- の先頭の文字は大文字であり、それ以外の文字はすべて小文字である。
入力
1行に、文字列 が与えられる。
条件
- 実行時間制限: 2s
- メモリ制限: 1024MB
- の各文字は英大文字または英小文字である。
出力
条件が満たされていれば Yes
を、そうでなければ No
を出力すること。
解法
文字列 のうち、「 s[0]
にあたる部分が大文字かつ、それ以外の部分はすべて小文字」という条件を満たしているかを、 の先頭から順番に各文字を見ていくことによって、この問題を解くことができます。
ここで、 s[0]
が大文字かどうかの判定について C++ では 'A' <= s[0] && s[0] <= 'Z'
の条件式によって行えます。
同様に、 s[i]
が小文字かどうかの判定については 'a' <= s[i] && s[i] <= 'z'
によって行えます。
以上を用いることによって、 の計算量で条件を満たすか否かの判定を行えます。
ソースコード
main()
関数の中に、答えを出力する部分を直接実装しました。
int main() { // 値の入力 string s; cin >> s; bool flag = true; // flag は true のときに条件を満たし、 false のときに条件を満たさない if ('A' <= s[0] && s[0] <= 'Z') { // 先頭から2番目の文字から順番に、小文字かどうかを見ていく for (int i = 1; i < s.length(); i++) { if (!('a' <= s[i] && s[i] <= 'z')) { flag = false; // s[i] が小文字でないときは flag を false にする } } } else { flag = false; // 先頭が大文字でないときは flag を false にする } // 答えの出力 if (flag) { Yes(); } else { No(); } return 0; }