Problem:
Score : 300 points

Problem Statement

Snuke can change a string t of length N into a string t' of length N - 1 under the following rule:

For each i (1 ≤ i ≤ N - 1), the i-th character of t' must be either the i-th or (i + 1)-th character of t.

There is a string s consisting of lowercase English letters.
Snuke's objective is to apply the above operation to s repeatedly so that all the characters in s are the same.
Find the minimum necessary number of operations.

Constraints

1 ≤ |s| ≤ 100

s consists of lowercase English letters.

Input

Input is given from Standard Input in the following format:

s

Output

Print the minimum necessary number of operations to achieve the objective.

Sample Input 1

serval

Sample Output 1

3

One solution is: serval → srvvl → svvv → vvv.

Sample Input 2

jackal

Sample Output 2

2

One solution is: jackal → aacaa → aaaa.

Sample Input 3

zzz

Sample Output 3

0

All the characters in s are the same from the beginning.

Sample Input 4

whbrjpjyhsrywlqjxdbrbaomnw

Sample Output 4

8

In 8 operations, he can change s to rrrrrrrrrrrrrrrrrr.

Solution in C++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#define _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES 1
#include <sstream>
#include <vector>
#include <string>
#include <algorithm>
#include <numeric>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <random>
#include <ctime>

#define MOD 1000000007

const long long INF = 10000000000000000;

using namespace std;

int exp(string s){
	int cnt=0;
	int val=1;
	while(val<s.size()){
		val*=2;
		cnt++;
	}
	return cnt;
}

int func(char target, string s){

	int cnt=0;
	int max_length=0;
	for(int i=0;i<s.size();i++){
		
		if(s[i]==target){
			cnt=0;
		}else{
			cnt++;
		}
		max_length=max(max_length,cnt);
	}
	//cout<<target<<" "<<"return "<<max_length<<endl; 
	return max_length;
}

int main(){
	string s;
	cin>>s;
	map<char,int> mp;
	for(int i=0;i<s.size();i++){
		mp[s[i]]++;
	}
	int max_num=0;
	char target;
	int ans=s.size();
	for(auto itr=mp.begin();itr!=mp.end();++itr){
	//	cout<<itr->first<<" "<<itr->second<<endl;
		if(max_num<itr->second){
			ans=s.size();
		}
		if(max_num<=itr->second){
			ans=min(ans,func(itr->first,s));
			max_num=max(max_num,itr->second);
			target=itr->first;
		}
	}
	if(max_num<=1){
		cout<<exp(s)<<endl;
		return 0;
	}
	cout<<ans<<endl;

	return 0;
}