已知前序,中序,輸出後序。最長迴文問題

     

         朋友們,很久不見了。最近忙着其餘事情,一直沒有到博客園轉轉。大家還好嗎?java

        已知二叉樹的前序和中序,輸出後序。不能用其餘非標準庫node

        輸入:ABweb

               BA算法

       輸出:BA數據結構

AB
BA
 1 import java.util.Scanner;  2 /**
 3  * 數據結構  4  * @author xiaoyi115  5  * @webSite http://www.cnblogs.com/xiaoyi115/
 6  * @email liangliang.mao@foxmail.com  7  * @param <DataType>  8  */
 9 class Node{ 10     public String nodeValue; 11     public Node leftNode; 12     public Node rightNode; 13     public Node(){ 14         leftNode=null; 15         rightNode=null; 16  } 17     
18 } 19 public class Main { 20     public static void getTree(Node root,String pre,String mid){ 21         if (pre.length()<=0) { 22             return; 23  } 24         if (root==null) { 25             root=new Node(); 26  } 27         String value=String.valueOf(pre.charAt(0)); 28         root.nodeValue=value; 29         int i=0; 30         String midvalue=String.valueOf(mid.charAt(i)); 31         while(i<mid.length()&&!value.equals(midvalue)){ 32             i++; 33             midvalue=String.valueOf(mid.charAt(i)); 34  } 35         if(i>=1&&i<=pre.length()){ 36             root.leftNode=new Node(); 37             getTree(root.leftNode,pre.subSequence(1, i+1).toString(), mid.subSequence(0, i).toString()); 38  } 39         if (i<pre.length()-1) { 40             root.rightNode=new Node(); 41             getTree(root.rightNode, pre.subSequence(i+1, pre.length()).toString(), mid.subSequence(i+1, mid.length()).toString()); 42  } 43  } 44     public static void print(Node root){ 45         if(root==null) 46             return; 47  print(root.leftNode); 48  print(root.rightNode); 49  System.out.print(root.nodeValue); 50  } 51     public static void main(String[] args){ 52         Scanner scanner=new Scanner(System.in); 53         
54         String pre=scanner.next(); 55         String mid=scanner.next(); 56         
57         Node root=new Node(); 58  getTree(root, pre, mid); 59  print(root); 60  } 61 }

最長迴文。好比:spa

3
abababa
aaaabaa
acacdas
輸出:
7
5
3
一、暴力解法。O(N3)
二、動態規劃。O(N2)
三、還有一種很牛逼的方法,是O(N).我對這個算法仍是不明覺厲中。
 1 int times=scanner.nextInt();  2         //x:
 3         for (int N = 0; N < times; N++) {  4             if(scanner.hasNext()){  5                 char[] str=scanner.next().toCharArray();  6                 int maxLen=1;  7                 int[][] A=new int[str.length][str.length];  8                 for (int i = 0; i < str.length; i++) {  9                     for (int j = 0; j < str.length; j++) { 10                         if (i==j) { 11                             A[i][j]=1; 12                         }else { 13                             A[i][j]=0; 14  } 15  } 16  } 17                 
18                 for (int len = 2; len <=str.length; len++) {//表示長度
19                     for (int begin = 0; begin < str.length-len+1; begin++) { 20                         if((str[begin]==str[begin+len-1]&&len==2)||(str[begin]==str[begin+len-1]&&A[begin+1][begin+len-2]==1)){ 21                             maxLen=len; 22                             A[begin][begin+len-1]=1; 23  } 24  } 25  } 26  System.out.println(maxLen); 27  } 28             }

 

    版權全部,歡迎轉載,可是轉載請註明出處:瀟一code

相關文章
相關標籤/搜索