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 (GCC 5.4.1) (judge verdict: Runtime Error)

#include<stdio.h>
#include<string.h>
#include<stdbool.h>


char S[100];//文字列//初期化のためグローバル宣言とした
char s[100];//操作用文字列//初期化のためグローバル宣言とした

int main() {

	//方針
	//初期状態において全て同じアルファベットならば終了する
	//全てのアルファベットで何回書き換えが必要か全探索する

	//変数
	//char S[100];//文字列//初期化のためグローバル宣言とした
	int  len_S;//文字列の文字数
	//char s[100];//操作用文字列//初期化のためグローバル宣言とした
	int  len_s;//操作用文字列の文字数
	char word;//指定文字
	int change_cnt = -1;//操作用文字列での必要書き換え回数（探索用）
	int result[26];//操作用文字列での必要書き換え回数//初期化のためグローバル宣言とした
	int match_cnt;//探索時２つ共同じ文字であった回数

	int i;
	bool fin = false;
	int ans = 10000;

	//文字列を入力する
	scanf("%s", S);
	len_S = strlen(S);

	//アルファベット全探索(所定文字でのループ）
	for (word = 97; word < 123; word++)
	{
		//操作用文字列を作成する
		strcpy(s, S);
		len_s = strlen(s);

		//変数の初期化
		change_cnt = -1;

		for (int i = 0; i < 26; i++)
		{
			result[i] = 1000;
		}

		while (fin == false)//この文字で文字毎のループ
		{
			//変数の初期化
			match_cnt = -1;

			change_cnt++;

			if (len_s == 1)
			{
				result[word - 97] = change_cnt;//この文字における必要な文字列書き換え回数の結果
				//printf("result[%c] : %d\n", word, result[word - 97]);
				fin = true;//この文字でのシミュレーションは終了した
				break;//この文字でのシミュレーションは終了した
			}
			else
			{

				for (i = 0; i < len_s - 1; i++)//文字列の全ての文字に対して最初から最後のひとつ前まで
				{
					if (s[i] == word && s[i + 1] == word)//二つともこの文字と一致
					{
						match_cnt++;//回数をカウントする
						//s[i] = word;//この文字に変更する
					}
					else if (s[i] == word || s[i + 1] == word)//二つのいずれかがこの文字と一致
					{
						s[i] = word;//この文字にする
					}
					else//二つのいずれもこの文字と一致しない
					{
						if (len_s == 2)//len_sが２だったらこの文字のみの文字列にはならない
						{
							//result[word - 97]の値は変更しない
							//printf("result[%c] : %d\n", word, result[word - 97]);
							fin = true;//この文字でのシミュレーションは終了した
							break;//この文字でのシミュレーションは終了した
						}
					}

					if (i == match_cnt && i == len_s - 2)//全てこの文字になっていた場合
					{
						result[word - 97] = change_cnt;//この文字における必要な文字列書き換え回数の結果
						//printf("result[%c] : %d\n", word, result[word - 97]);
						fin = true;//この文字でのシミュレーションは終了した
						break;//この文字でのシミュレーションは終了した
					}
				}
			}
			len_s--;//一番右の文字を削除する代わりに文字列長さをひとつ減らす

		}//この文字で文字毎のループ

		if (result[word - 97] < ans)
		{
			ans = change_cnt;
		}

		fin = false;
	}//アルファベット全探索(所定文字でのループ）

	printf("%d\n", ans);

	return 0;
}