#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;
}