#include <bits/stdc++.h>
const int maxn = 2e5 + 3;
int acable[27];
char s[maxn];
int n, pre[maxn], opt[maxn];
std::unordered_map<int, int> mpos;
int main() {
  for (int i = 1; i < 27; ++i) {
    acable[i] = 1 << (i - 1);
  }
  scanf("%s", s);
  n = strlen(s);
  mpos[0] = 0;
  for (int i = 1; i <= n; ++i) {
    pre[i] = pre[i - 1];
    pre[i] ^= 1 << (s[i - 1] - 'a');
    if (mpos.find(pre[i]) == mpos.end()) {
      mpos[pre[i]] = i;
    }
  }
  memset(opt, 0x7f, sizeof(int) * (n + 1));
  opt[0] = 0;
  for (int i = 1; i <= n; ++i) {
    for (int j = 0; j < 27; ++j) {
      if (mpos.find(pre[i] ^ acable[j]) != mpos.end()) {
        opt[i] = std::min(opt[i], opt[mpos[pre[i] ^ acable[j]]] + 1);
      }
    }
  }
  printf("%d\n", opt[n]);
  return 0;
}
