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 JavaScript (node.js v5.12) (judge verdict: Wrong Answer)

var output;
var input = require("fs").readFileSync("/dev/stdin", "utf8").trim().split("\n");
var obj = {
  "list" : input,
  "index" : 0,
  "max" : input.length,
  "next" : function(){
    if(!this.hasNext()){throw "NoSuchElementException:次に要素は無いよ";}
    var returnObj = this.list[this.index];
    this.index++;
    return returnObj;
  },
  "hasNext" : function(){return (this.index < this.max);}
}
Main();
function next(){return obj.next();}
function hasNext(){return obj.hasNext();}
function myout(t){console.log(t);}//standard output
function myerr(t){console.error(t);}//standard error
//[no]要素の扱い。数値型
//不明値、異常時:引数そのまま返す
//1:数値へ変換 2:半角SPで分割 4:半角SPで分割し、数値配列へ
//6:1文字に分割 7:1文字に分割し、数値配列へ
//8:半角SPで結合 9:改行で結合 0:文字なしで結合
function myconv(i,no){try{switch(no){case 1:return parseInt(i);case 2:return i.split(" ");case 4:return i.split(" ").map((a)=>Number(a));case 6:return i.split("");case 7:return i.split("").map((a)=>Number(a));case 8:return i.join(" ");case 9:return i.join("\n");case 0:return i.join("");default:return i;}}catch(e){return i;}}
function Main() {
  var s = myconv(next(),6);
  var list = {};
  for(var i = 0; i < s.length; i++){
    if(list[s[i]] == null){
       list[s[i]] = 1;
    }else{
       list[s[i]]++;
    }
  }
  var maxKeys = [];
  var max = 0;
  var keys = Array.from(Object.keys(list));
  for(var i = 1; i < keys.length; i++){
    max = Math.max(max,list[keys[i]]);
    if(max < list[keys[i]]){
       max = list[keys[i]];
    }
  }
  for(var i = 0; i < keys.length; i++){
    if(max == list[keys[i]]){
    	maxKeys.push(keys[i]);
    }
  }
  myerr(maxKeys);
  var output = 101;
  for(var j = 0; j < maxKeys.length; j++){
    var tmpKey = maxKeys[j];
    var tmpS = Object.assign([],s);
    var count = 0;
  while(!check(tmpS,tmpKey)){
    for(var i = 0; i < tmpS.length; i++){
      if(tmpS[i+1] == tmpKey){
         tmpS[i] = tmpKey;
      }
    }
    tmpS.pop();
    count++;
  }
    myerr(tmpS);
    output = Math.min(output,count);
  }
  if(output == 101){
     output = 0;
  }
  myout(output);
}
function check(str,chr){
    var ret = true;
    for(var i = 0; i < str.length; i++){
      if(str[i] != chr){
         ret = false;
      }
    }
    return ret;
}