//Graph BFS:Codechef DIGJUMP
#include<bits/stdc++.h>
using namespace std;
#define showoff ios_base::sync_with_stdio(false)
#define ll long long int
#define sd(x) scanf("%d", &x)
#define pf(x) printf("%d",&x)
typedef vector< int > vi;
typedef vector< vi > vvi;
typedef pair< int,int > ii;
#define sz(a) int((a).size())
#define pb push_back
#define all(c) (c).begin(),(c).end()
#define rall(c) c.rbegin(), c.rend()
#define tr(c,i) for(typeof((c).begin() i = (c).begin(); i != (c).end(); i++)
#define present(c,x) ((c).find(x) != (c).end())
#define cpresent(c,x) (find(all(c),x) != (c).end())
#define maxn 100001
vector<int>adj[maxn];
//int dist[maxn];
bool visit[maxn];
string s;int n;
void make_graph(string s,int n){
for(int i=0;i<n;i++){
if(i==0)
adj[i].pb(i+1);
else if(i==n-1)
adj[i].pb(i-1);
else
{
adj[i].pb(i-1);
adj[i].pb(i+1);
}
for(int j=0;j<s.length();j++){
if(s[j]==s[i] && j!=i-1 && j!=i+1 && i!=j)
adj[i].pb(j);
}
}}
int bfs(){
int moves=0;
priority_queue<int>q;
q.push(0);
while(!q.empty()){
int node = q.top();
if(node==n-1)
break;
if(visit[node])
continue;
else{
visit[node]=true;
moves++;
}
for(auto it =adj[node].begin();it!=adj[node].end();it++){
q.push(*it);
}
}
return moves;
}
int main(){
for(int i=0;i<maxn;i++)
visit[i]=false;
cin>>s;
n=s.length();
make_graph(s,n);
int moves=bfs();
cout<<moves;
}
Ly9HcmFwaCBCRlM6Q29kZWNoZWYgRElHSlVNUAojaW5jbHVkZTxiaXRzL3N0ZGMrKy5oPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwojZGVmaW5lIHNob3dvZmYgICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSkKI2RlZmluZSBsbCBsb25nIGxvbmcgaW50CiNkZWZpbmUgc2QoeCkgc2NhbmYoIiVkIiwgJngpCiNkZWZpbmUgcGYoeCkgcHJpbnRmKCIlZCIsJngpCnR5cGVkZWYgdmVjdG9yPCBpbnQgPiB2aTsKdHlwZWRlZiB2ZWN0b3I8IHZpID4gdnZpOwp0eXBlZGVmIHBhaXI8IGludCxpbnQgPiBpaTsKI2RlZmluZSBzeihhKSBpbnQoKGEpLnNpemUoKSkKI2RlZmluZSBwYiBwdXNoX2JhY2sKI2RlZmluZSBhbGwoYykgKGMpLmJlZ2luKCksKGMpLmVuZCgpCiNkZWZpbmUgcmFsbChjKSBjLnJiZWdpbigpLCBjLnJlbmQoKQojZGVmaW5lIHRyKGMsaSkgZm9yKHR5cGVvZigoYykuYmVnaW4oKSBpID0gKGMpLmJlZ2luKCk7IGkgIT0gKGMpLmVuZCgpOyBpKyspCiNkZWZpbmUgcHJlc2VudChjLHgpICgoYykuZmluZCh4KSAhPSAoYykuZW5kKCkpCiNkZWZpbmUgY3ByZXNlbnQoYyx4KSAoZmluZChhbGwoYykseCkgIT0gKGMpLmVuZCgpKQojZGVmaW5lIG1heG4gIDEwMDAwMQp2ZWN0b3I8aW50PmFkalttYXhuXTsKLy9pbnQgZGlzdFttYXhuXTsKYm9vbCB2aXNpdFttYXhuXTsKc3RyaW5nIHM7aW50IG47CnZvaWQgbWFrZV9ncmFwaChzdHJpbmcgcyxpbnQgbil7CiAgICBmb3IoaW50IGk9MDtpPG47aSsrKXsKICAgICAgICBpZihpPT0wKQogICAgICAgIGFkaltpXS5wYihpKzEpOwogICAgICAgIGVsc2UgaWYoaT09bi0xKQogICAgICAgIGFkaltpXS5wYihpLTEpOwogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGFkaltpXS5wYihpLTEpOwogICAgICAgICAgICBhZGpbaV0ucGIoaSsxKTsKICAgICAgICB9CiAgICBmb3IoaW50IGo9MDtqPHMubGVuZ3RoKCk7aisrKXsKICAgICAgICBpZihzW2pdPT1zW2ldICYmIGohPWktMSAmJiBqIT1pKzEgJiYgaSE9aikKICAgICAgICBhZGpbaV0ucGIoaik7CiAgICB9CiAgICAKfX0KaW50IGJmcygpewoJaW50IG1vdmVzPTA7Cglwcmlvcml0eV9xdWV1ZTxpbnQ+cTsKCXEucHVzaCgwKTsKCXdoaWxlKCFxLmVtcHR5KCkpewoJCWludCBub2RlID0gcS50b3AoKTsKCQlpZihub2RlPT1uLTEpCgkJYnJlYWs7CgkJaWYodmlzaXRbbm9kZV0pCgkJY29udGludWU7CgkJZWxzZXsKCQl2aXNpdFtub2RlXT10cnVlOwoJCW1vdmVzKys7CgkJfQoJCWZvcihhdXRvIGl0ID1hZGpbbm9kZV0uYmVnaW4oKTtpdCE9YWRqW25vZGVdLmVuZCgpO2l0KyspewoJCQlxLnB1c2goKml0KTsKCQl9Cgl9CglyZXR1cm4gbW92ZXM7Cn0KCmludCBtYWluKCl7CiAgICBmb3IoaW50IGk9MDtpPG1heG47aSsrKQogICAgdmlzaXRbaV09ZmFsc2U7CiAgICBjaW4+PnM7CiAgICBuPXMubGVuZ3RoKCk7CiAgICBtYWtlX2dyYXBoKHMsbik7CiAgICBpbnQgbW92ZXM9YmZzKCk7CiAgICBjb3V0PDxtb3ZlczsKfQ==