#include <bits/stdc++.h>
char s[1000010];
int max_pos_by_allowed_and_len[1 << 20][21];
constexpr int full = (1 << 20) - 1;
template <typename T>
void mx(T& x, T y) {
  x = (x > y ? x : y);
}
void update(const int* __restrict__ a, int* __restrict__ b) {
  for (int i = 0; i < 21; i += 7) {
    mx(b[i + 0], a[i + 0]);
    mx(b[i + 1], a[i + 1]);
    mx(b[i + 2], a[i + 2]);
    mx(b[i + 3], a[i + 3]);
    mx(b[i + 4], a[i + 4]);
    mx(b[i + 5], a[i + 5]);
    mx(b[i + 6], a[i + 6]);
  }
}
int main() {
  scanf("%s", s);
  int n = strlen(s);
  for (int i = 0; i < n; ++i) s[i] -= 'a';
  for (int i = 1; i <= n; ++i) {
    int used = 0;
    for (int j = i; j > 0; --j) {
      if ((used >> s[j - 1]) & 1) break;
      used |= (1 << s[j - 1]);
      max_pos_by_allowed_and_len[full ^ used][i - j + 1] = i;
    }
  }
  for (int mask = full; mask > 0; --mask) {
    for (int bit = 0; bit < 20; ++bit) {
      int updated = mask ^ (1 << bit);
      if (updated > mask) continue;
      update(&max_pos_by_allowed_and_len[mask][0],
             &max_pos_by_allowed_and_len[updated][0]);
    }
  }
  int ans = 1;
  for (int i = 1; i <= n; ++i) {
    int used = 0;
    for (int j = i; j > 0; --j) {
      if ((used >> s[j - 1]) & 1) break;
      used |= (1 << s[j - 1]);
      for (int other_len = 20; other_len >= 0; --other_len) {
        if (max_pos_by_allowed_and_len[used][other_len] > i) {
          mx(ans, i - j + 1 + other_len);
          break;
        }
      }
    }
  }
  printf("%d\n", ans);
  return 0;
}
