Official

A - A Unique Letter Editorial by physics0523


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

実装例(C++):

#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;
}

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

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

a : 1
b : 2
c : 1
d : 0
...
y : 0
z : 1

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

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

実装例(C++):

#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++):

#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: