2018春招京东JAVA后台实习编程题第一题

采用动态规划的思路求解

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

猜你喜欢

转载自blog.csdn.net/qq_16403141/article/details/79873461