#include <bits/stdc++.h>
using namespace std;
const int MAXN = 55;
int dp[MAXN][MAXN];
int main()
{
    string s;cin >> s;
    int n = s.size();
    memset(dp,0x1,sizeof(dp));// 初始化dp数组,所有值设为一个较大的数
    for(int i = 0; i < n; i++)dp[i][i] = 1;// 单个字符涂色需要1次操作
    // for(int i = 0; i < n; i++)
    // {
    //     for(int j = 0;j < n;j++)
    //     {
    //         if(dp[i][j] >= 16843009) cout << "0";
    //         else cout << dp[i][j];

    //         if(j!= n-1)cout << " ";
    //         else cout << " |";

    //     }cout << endl;
    // }
    // cout << "-----------" << endl;

    //直接算两个字符的,一个字符的在上面弄过了 
    for (int len = 1; len < n; len++) 
    {
        // 遍历所有可能的子串长度起点
        for (int i = 0; i < n - len; i++) 
        {
            int j = i + len;//终点
            if (s[i] == s[j])dp[i][j] = min(dp[i][j-1], dp[i+1][j]);//处理回文特殊字串,判左小还是右
            for(int k = i; k < j; k++)
            {
                dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j]);//枚举子串内最小值
            }
        }//cout << endl;
    }

    // for(int i = 0; i < n; i++)
    // {
    //     for(int j = 0;j < n;j++)
    //     {
    //         if(dp[i][j] >= 10000) cout << "0";
    //         else cout << dp[i][j];

    //         if(j!= n-1)cout << " ";
    //         else cout << " |";

    //     }cout << endl;
    // }
    // cout << "-----------" << endl;

    cout << dp[0][n-1] << endl;
    return 0;
}