#include <bits/stdc++.h>
using namespace std;
template <typename T, size_t N>
void PA(const T (&a)[N], int n = -1) {
  if (!n) n = N;
  for (int i = 0; i < n; i++) cout << a[i] << " ";
  cout << '\n';
}
template <typename T, size_t N, size_t M>
void PA(const T (&a)[N][M], int n, int m) {
  for (int i = 0; i < n; i++) PA(a[i], m);
  cout << '\n';
}
struct hash_pair {
  template <class T1, class T2>
  size_t operator()(const pair<T1, T2>& p) const {
    auto hash1 = hash<T1>{}(p.first);
    auto hash2 = hash<T2>{}(p.second);
    return hash1 ^ hash2;
  }
};
struct cmp {
  bool operator()(const pair<int, int>& a, const pair<int, int>& b) const {
    if (a.first != b.first)
      return a.first > b.first;
    else
      return a.second < b.second;
  }
};
template <typename T>
T power(T x, int y) {
  T r = 1;
  while (y > 0) {
    if (y & 1) r *= x;
    x *= x;
    y /= 2;
  }
  return r;
}
void print_no() { cout << "nO" << '\n'; }
void print_yes() { cout << "yEs" << '\n'; }
unordered_map<char, int> mp;
string s;
bool flag;
void solve() {
  cin >> s;
  for (auto it : s) mp[it]++;
  if (mp.size() > 4) return print_no();
  if (mp.size() == 4) return print_yes();
  if (mp.size() == 3) {
    flag = false;
    for (auto it : mp) flag |= it.second > 1;
    if (flag)
      return print_yes();
    else
      return print_no();
  }
  if (mp.size() == 2) {
    flag = true;
    for (auto it : mp) flag &= it.second > 1;
    if (flag)
      return print_yes();
    else
      return print_no();
  }
  return print_no();
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  solve();
}
