Official

A - A Unique Letter Editorial by physics0523


今回の問題を以下のように場合分けで解くことは可能です。

実装例(C++):

Copy
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int main(){
  4. string s;
  5. cin >> s;
  6. if(s[0]!=s[1] && s[0]!=s[2]){cout << s[0] << "\n";}
  7. else if(s[1]!=s[0] && s[1]!=s[2]){cout << s[1] << "\n";}
  8. else if(s[2]!=s[0] && s[2]!=s[1]){cout << s[2] << "\n";}
  9. else{cout << "-1\n";}
  10. return 0;
  11. }
#include<bits/stdc++.h>

using namespace std;

int main(){
  string s;
  cin >> s;
  if(s[0]!=s[1] && s[0]!=s[2]){cout << s[0] << "\n";}
  else if(s[1]!=s[0] && s[1]!=s[2]){cout << s[1] << "\n";}
  else if(s[2]!=s[0] && s[2]!=s[1]){cout << s[2] << "\n";}
  else{cout << "-1\n";}
  return 0;
}

しかし、今回の解説では、より野心的に「文字列 SS にある文字が何度含まれるか」という問題を解くことを考えましょう。

入力 S=S= abcbz の時に目指す出力

Copy
  1. a : 1
  2. b : 2
  3. c : 1
  4. d : 0
  5. ...
  6. y : 0
  7. z : 1
a : 1
b : 2
c : 1
d : 0
...
y : 0
z : 1

基本となる考えはバケットソートですが、今回は添え字を文字として取り扱う必要があります。

これには色々な方法がありますが、例えば、連想配列 map<char,int> (文字 (char 型) を添え字にとって int 型の配列のように扱えるデータ構造。 map<char,int> の場合は0で初期化される。) を用いて、以下のように実装できます。

実装例(C++):

Copy
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int main(){
  4. string s;
  5. cin >> s;
  6. map<char,int> mp;
  7. for(auto &nx : s){mp[nx]++;}
  8. for(char i='a';i<='z';i++){
  9. cout << i << " : " << mp[i] << "\n";
  10. }
  11. return 0;
  12. }
#include<bits/stdc++.h>

using namespace std;

int main(){
  string s;
  cin >> s;
  map<char,int> mp;
  for(auto &nx : s){mp[nx]++;}
  for(char i='a';i<='z';i++){
    cout << i << " : " << mp[i] << "\n";
  }
  return 0;
}

このコードを応用すれば、今回の問題を解くこともできます。

実装例(C++):

Copy
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int main(){
  4. string s;
  5. cin >> s;
  6. map<char,int> mp;
  7. for(auto &nx : s){mp[nx]++;}
  8. for(char i='a';i<='z';i++){
  9. if(mp[i]==1){cout << i << "\n";return 0;}
  10. }
  11. cout << "-1\n";
  12. return 0;
  13. }
#include<bits/stdc++.h>

using namespace std;

int main(){
  string s;
  cin >> s;
  map<char,int> mp;
  for(auto &nx : s){mp[nx]++;}
  for(char i='a';i<='z';i++){
    if(mp[i]==1){cout << i << "\n";return 0;}
  }
  cout << "-1\n";
  return 0;
}

posted:
last update:



2025-04-05 (Sat)
09:33:06 +00:00