/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
public static void main
(String[] args
) throws java.
lang.
exception{ System.
out.
println(minCuts
("ABCD")); }
static HashMap
<Integer, HashSet
<Integer
>> palindromes
= new HashMap
<>();
public static int minCuts
(String str
) { int[] arr = new int[str.length() + 1];
arr[str.length()] = -1;
fillPalindromes(str);
for (int i = str.length() - 1; i >= 0; i--)
for (int j = i; j < str.length(); j++) {
if (palindromes.containsKey(i))
if (palindromes.get(i).contains(j))
arr[i] = arr[i] > arr[j + 1] + 1 ? arr[j + 1] + 1 : arr[i];
}
return arr[0];
}
public static void fillPalindromes
(String str
) { for (int i = 0; i < str.length(); i++) {
for (int j = 0; i - j >= 0 && j + i < str.length(); j++)
if (str.charAt(i - j) == str.charAt(j + i)) {
if (palindromes.containsKey(i - j))
palindromes.get(i - j).add(i + j);
else {
HashSet<Integer> hs = new HashSet<>();
hs.add(i + j);
palindromes.put(i - j, hs);
}
} else
break;
}
for (double i = 0.5; i < str.length() - 1; i++)
for (double j = 0.5; i - j >= 0 && i + j < str.length(); j++)
if (str.charAt((int) (i - j)) == str.charAt((int) (i + j))) {
if (palindromes.containsKey((int) (i - j)))
palindromes.get((int) (i - j)).add((int) (i + j));
else {
HashSet<Integer> hs = new HashSet<>();
hs.add((int) (i + j));
palindromes.put((int) (i - j), hs);
}
} else
break;
}
}