質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%

Q&A

解決済

1回答

1220閲覧

回文を部分文字列として含まない文にできるかどうか判定

cunwe

総合スコア65

0グッド

0クリップ

投稿2020/05/02 06:22

https://atcoder.jp/contests/cf17-final/tasks/cf17_final_b

自力では解けなかったので、こちらの問題を正解している方のわかりやすそうなコードをお借りして意味を理解しようと努めているのですがいくつか確認したい点があるので質問させてください。

#include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { string S; cin >> S; vector<int> cnt(3, 0); for (int i=0;i< S.size();i++) cnt[S[i] - 'a']++;//1 string ans = "YES"; for (int i=0;i<3;++i){//2 for (int j=0;j<3;++j){//2 if (abs(cnt[i] - cnt[j]) > 1) ans = "NO"; } } cout << ans << endl; return 0; }

1.文字列S中に含まれるa,b,cという文字の個数をそれぞれカウントしているのでしょうか?
2.このiとjの二重ループはどういう意味なのでしょうか?またiとjが0から2までの3つなのはa,b,cの3つに対応しているということでしょうか?
以上になります。よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

  1. その通りです。
  2. 0,1,2はそれぞれ、a,b,cに対応しています。部分文字列として含まない文に出来る条件は、「各文字種の個数の差が1以下」なので、そのチェックを楽にやるため二重ループを使ったという解答ですね。なぜ各文字種の個数の差が1以下でなくてはいけないかは、AtCoder公式の解答pdfを見れば理解出来るかと思います。

投稿2020/05/02 06:54

minaminao

総合スコア249

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cunwe

2020/05/02 09:15

そういうことなのですね。その二重ループはなかなか自分では思いつかなそうですが、理解できました。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問