采用动态规划的思路求解
以ACCA为例:
解题思路:依次读取字符,A,C,C,A。做如下操作
读取A:
A有取或者不取两种情况,那么结果是:A或者null,
判断是否有回文串,依题目可知:A为回文串,则次数+1;
然后将A和null加入队列中;
读取C:
将C和队列中的所有字符串相加,得到:AC和C
判断是否有回文串,依题目可知:C为回文串,次数+1;
然后将AC和C加入队列;
读取C:
将C和队列中的所有字符串相加,得到:AC,C,ACC,CC
判断是否有回文串,依题目可知:C,CC为回文串,次数+2;
按照这个做法,读取到字符串结尾,即可。
附上源码:
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class Main2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String in = sc.nextLine().trim();
int num = 0;
Queue<String> queue = new LinkedList<>();
for(int i = 0; i<in.length();i++) {
String tmp = in.charAt(i)+"";
if(queue.isEmpty()) {
if(isHuiWen(tmp))num++;
queue.add(tmp);
queue.add("null");
queue.add("#");
}else {
String str = queue.poll();
while(!"#".equals(str)) {
String d;
if("null".equals(str)) {
d = tmp;
}else {
d = str+tmp;
}
if(isHuiWen(d))num++;
queue.add(d);
queue.add(str);
str = queue.poll();
}
queue.add("#");
}
}
System.out.println(num);
}
public static boolean isHuiWen(String text) {
int length = text.length();
for (int i = 0; i < length / 2; i++) {
if (text.toCharArray()[i] != text.toCharArray()[length - i - 1]) {
return false;
}
}
return true;
}
}