Problem:
Score : 200 points

Problem Statement

You are given a string S of length N consisting of lowercase English letters.
We will cut this string at one position into two strings X and Y.
Here, we would like to maximize the number of different letters contained in both X and Y.
Find the largest possible number of different letters contained in both X and Y when we cut the string at the optimal position.

Constraints

2 \leq N \leq 100

|S| = N

S consists of lowercase English letters.

Input

Input is given from Standard Input in the following format:

N
S

Output

Print the largest possible number of different letters contained in both X and Y.

Sample Input 1

6
aabbca

Sample Output 1

2

If we cut the string between the third and fourth letters into X = aab and Y = bca, the letters contained in both X and Y are a and b.
There will never be three or more different letters contained in both X and Y, so the answer is 2.

Sample Input 2

10
aaaaaaaaaa

Sample Output 2

1

However we divide S, only a will be contained in both X and Y.

Sample Input 3

45
tgxgdqkyjzhyputjjtllptdfxocrylqfqjynmfbfucbir

Sample Output 3

9

Solution in C# (Mono 4.6.2.0) (judge verdict: Runtime Error)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
class Program
{
    static void Main(string[] args)
    {
            // 入力
            string sS = Console.ReadLine().Trim();
            int iN = int.Parse(sS);
            sS = Console.ReadLine().Trim();

            System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
            sw.Start();

            // 解析
            List<int> lstRt = new List<int>();
            for (int i = 1; i < sS.Length - 1; i++)
            {
                string sF = sS.Substring(0, i);
                string sB = sS.Substring(i, sS.Length - i);
                sF = new string(sF.ToCharArray().Distinct().ToArray());                 // charからstringへ変換  // 文字列内から重複文字削除
                sB = new string(sB.ToCharArray().Distinct().ToArray());                 // charからstringへ変換  // 文字列内から重複文字削除
                int iCnt = 0;
                for (int j = 0; j < sF.Length; j++)
                {
                    string sO = sF.Substring(j, 1);
                    if (sB.Contains(sO)) { iCnt += 1; }
                }
                lstRt.Add(iCnt);
            }
            lstRt.Sort(delegate (int mca1, int mca2) { return (int)(mca2 - mca1); });  // 降順

            // 出力
            Console.WriteLine("{0}", lstRt[0].ToString().Trim());

            sw.Stop();
#if DEBUG
            Console.WriteLine();
            Console.WriteLine("{0}", sw.Elapsed.ToString());
            Console.WriteLine("続行するには何かキーを押してください．．．");
            Console.ReadKey();
#endif
    }

}