一串字符串 用最少的分割次数把他们都变成回文串,
比如ABA 就不需要分割 返回0
思路:递归处理从小规模开始处理 ,遇到大规模则可以先计算小的规模,然后把范围缩小,成小规模然后计算,每个规模都会有一个结果,最最优解不是单独一个规模的最优解,而是整体的最优解,先处理简单的 比如一个字符 那自然就返回0 还有两个一样的也返回0 还有只有中间和两边不一样的 也返回0 ,通过这些情况逐渐把问题分解
基本的判断
static int getMin(Integer[][]result,int first,int second,char[]arr){if(result[first][second]==null){if(first==second){result[first][second]=0;return 0;}else if(second-first==1){char secondChar = arr[second];char firstChar = arr[first];if(secondChar==firstChar){result[first][second]=0;return 0;}else{result[first][second]=1;return 1;}}else if(second-first==2){char secondChar = arr[second];char midChar=arr[first+1];char firstChar = arr[first];if(firstChar==secondChar){result[first][second]=0;return 0;}else if(midChar==firstChar||midChar==secondChar){result[first][second]=1;return 1;}else{result[first][second]=2;return 2;}}else{if(palindrome(arr,first,second)){result[first][second]=0;return 0;}int min=Integer.MAX_VALUE;for (int i = first; i < second; i++) {int curMin= getMin(result,first,i,arr)+getMin(result,i+1,second,arr)+1;min=Math.min(min,curMin);}result[first][second]=min;return min;}}else{return result[first][second];}}
比较难处理是 怎么把大规模转成小规模来计算,可以这样想,先从第一个哪里切一刀,这样剩下的继续求解,或者从第二个哪里切一刀,剩下的继续求解,还有一种情况一定要考虑到就是可以不切一刀,它自身就是回文串
判断是不是回文串方法
private static boolean palindrome(char[]arr,int first,int second){int mid=(second+first)/2;for (int i = first; i < mid; ) {if(arr[i]==arr[second]){second--;i++;continue;}else{return false;}}return true;}