unittest
{
	assert( [ "serval" ].parse.expand.solve == 3 );
	assert( [ "jackal" ].parse.expand.solve == 2 );
	assert( [ "zzz" ].parse.expand.solve == 0 );
	assert( [ "whbrjpjyhsrywlqjxdbrbaomnw" ].parse.expand.solve == 8 );
}



import std.algorithm;
import std.conv;
import std.range;
import std.stdio;
import std.typecons;

void main()
{
	stdin.byLineCopy.parse.expand.solve.writeln;
}

auto parse( Range )( Range input )
if( isInputRange!Range && is( ElementType!Range == string ) )
{
	auto s = input.front.to!( dchar[] );
	return tuple( s );
}

auto solve( dchar[] s )
{
	// 文字の数をカウント
	long[ dchar ] ns;
	foreach( c; s ) ns[ c ]++;
	
	// 存在する文字で順番に試行
	auto ans = long.max;
	foreach( k, n; ns )
	{
		auto r = 0L;
		auto t = s.dup;
		while( n < t.length )
		{
			// ルールに従って操作を実行（文字はできるだけkに置き換える）
			foreach( i, ref c; t[ 0 .. $ - 1 ] )
			{
				if( c == k ) continue;
				c = t[ i + 1 ];
				n += ( c == k );
			}
			n -= ( t[ $ - 1 ] == k );
			t.length--;
			r++;
		}
		ans = min( ans, r );
	}
	return ans;
}
