Introduction
回文串指其正向和反向相等的字符串。输入一个字符串,请将该字符串分割为一些子串,使得每个子串都是回文字符串,输出符合要求的最少的分割次数。
Input
输入为一行不包含空格的连续字符串。长度不超过100
Output
一个整数,分割次数
Sample
input
aaaaaaaaaaaaaaaa
output
0
Solution
import java.util.Scanner;
public class Main {
static int min;
static boolean[][] dp;
static char[] arr;
public static void main(String[] args) {
Scanner s=new Scanner(System.in);
String str=s.nextLine();
arr = str.toCharArray();
int len=arr.length;
dp = new boolean[len][len];
// 状态转移方程:在 s[i] == s[j] 的时候,dp[i][j] 参考 dp[i + 1][j - 1]
for (int right = 0; right < len; right++) {
for (int left = 0; left <= right; left++) {
if (arr[left] == arr[right] && (right - left <= 2 || dp[left + 1][right - 1])) {
dp[left][right] = true;
}
}
}
if(str.length()==0){
System.out.println(0);
}else {
min=Integer.MAX_VALUE;
backtracking(0,arr.length,0);
System.out.println(min-1);
}
}
public static void backtracking(int index, int len, int count){
if(index==len){
min=Math.min(count,min);
return;
}
for(int i=index;i<len;i++){
if(!dp[index][i])continue;
count+=1;
backtracking(i+1,len,count);
count-=1;
}
return;
}
}
Experience
这道题真只有80分,不知道问题出在了哪里。先是使用dp找到所有的回文字符串,然后回溯统计回文字符串切割的最少次数。