#問題文
英小文字からなる文字列
Sが与えられます。Sに含まれる文字がすべて異なるか判定してください。
#制約
2≤|S|≤26, ここで|S|は Sの長さを表す。Sは英小文字のみからなる。
とある中で自分は
#include <iostream> using std::string; using std::cin; using std::cout; int main(){ string s; cin >> s; int n=s.length(); for (int i=0;i<n;++i){ for (int j=i+1;j<n;++j){ if (s[i]!=s[j]){ cout << "yes" << endl; } else { cout << "no" << endl; } } } }
で提出したところWA(WrongAnswer)となってしまいました。解説PDFではfor文のまえにstring ans = "yes";
を用意してs[i]==s[j]
のときans="no"
を出力しそれ以外のときans="yes"
を出力していたのですが自分のやり方でWAになる原因がわかりません。原因がわかる方いらっしゃいましたら教えていただけると嬉しいです。よろしくお願い致します・
いきなり提出するのではなく、手元で試してみましたか。
手元で実行してみればすぐに気がつくと思うんだよなぁ。
ブラウザで実行できるcpp.shというのに自分のソースコードを貼って実行してみたところmaisumakunさんがおっしゃるように何個もyesやnoが出てしまいましたがそれぞれの文の直後でreturn 0;の記述を
追加したところ1回しか表示されなくなったので改善されたと思いそれを提出したところまたもやWAでした。。cpp.shで実行するとCE(Compile Error)は具体的な箇所が表示されるのですがWAは表示されないのでどこがダメかわからないものなのでしょうか?
どれか一つでも no なら no と出力しなければいけないわけですが、途中一回みつからなかっただけで yes と表示すると、最後までやったら no だった場合に間違いになります。
僕のコードですとそういった場合に対応していないのですね、ご指摘ありがとうございます。ということはcout << "yes" << endl;やcout << "no" << endl;をもう少し外に出すと良さそうですがそうすると今cout << "yes" << endl;を書いているところはどうしたらいいでしょうか?
回答が複数ついていますが、それではいけないんでしょうか。
質問のアルゴリズムに一番近い方法なら、まずフラグ変数を用意し、同じ文字が見つかった時点でフラグを立ててループを終了するという方法がよく使われていました。
ループを抜けた時に、フラグが立っていれば同じ文字が見つかった、立っていなければ見つかっていないということになるので、それによって出力を変えます。
boolでやるやつですか確かに過去にもやったことがあります、ありがとうございます。
回答3件
あなたの回答
tips
プレビュー