查找一个字符串中最大回文子串

给定一个字符串,查找该字符串中的最大回文子串。 

如: "a"    最大回文子串为 "a"  大小为1

        "aa"  最大回文子串为"aa" 大小为2

        "aaa" 最大回文子串为"aaa" 大小为3

        "aba" 最大回文子串为"aba" 大小为3

        "character" 最大回文子串为"carac" 大小为5

该问题是一个动态规划问题。该问题的最优解,具有最优子结构性质,即该最优解可由子问题的最优解组合而成。

假定对于一个从i到j的字符串s[i,j],具有最优解  (a1,a2,...an)。如果去除a1, an,则最优子结构(a2,....an-1)是 s[i+1, j-1]的最优解。

下面要多考虑了, 回文串奇偶的问题:

下面只记录了最大的回文子串的大小,如果需要输出回文子串,需要增加一个备完数组记录该串。

    public static void main(String[] args) throws Exception {

        Scanner in = new Scanner(System.in);
        String str = null;
        while((str=in.nextLine())!=null){
            int [][] tt = new int[str.length()+1][str.length()+1];
            char [] s = str.toCharArray();
            for(int i = str.length()-1; i >= 0; i--){

                for(int j = i; j <= str.length(); j++){
                    if(j==i) {
                        tt[i][j] = 0;
                        continue;
                    }
                    if((j-i)==1){
                        tt[i][j] = 1;
                        continue;
                    }
                    char a = s[i];
                    char b = s[j - 1];

                    if(a == b){
                        tt[i][j] = Math.max(tt[i][j-1] + 1, tt[i+1][j-1] + 2);
                    } else {
                        tt[i][j] = Math.max(tt[i][j-1], tt[i+1][j]);
                    }
                }
            }

            System.out.println(tt[0][str.length()]);
        }
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章