朋友們,很久不見了。最近忙着其餘事情,一直沒有到博客園轉轉。大家還好嗎?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