算法(五)、遞歸&&動態規劃&&揹包問題

算法(五)、遞歸&&動態規劃&&揹包問題java

1、遞歸算法

一、斐波拉契數列數組


public static int r(int n) {ide

    if (n <= 2) {spa

        return 1;orm

    } else {遞歸

        return r(n - 1) + r(n - 2);圖片

    }rem


}字符串


二、求數列的第n項

圖片1.png

// 1 1 10 28

public static int b(int n) {

    if (n <= 2) {

        return 1;

    } else {

        return 2 * b(n - 1) + 3 * b(n - 2) + 5;

    }

}


三、求n的階乘

public static int a(int n){
   if(n==1){
       return 1;
   }
   return n*a(n-1);    

}




四、全排列

public static void main(String[] args){
   list.add("a");list.add("b");list.add("c");list.add("d");
   listAll(list,"");

}

public static void listAll(List list, String prefix){
   //if(list.isEmpty()){
       System.out.println(prefix);
   //}
   for(int i=0;i<list.size();i++){
       List temp=new LinkedList(list);
       listAll(temp,prefix+((LinkedList)temp).remove(i));
   }

}


五、二分查找


public class BinarySearch {
   public static void main(String[] args){
       int[] arr={1,2,3,4,5};
       Arrays.sort(arr);
       binarySearch(arr,4,0,arr.length-1);
       System.out.println(binarySearch(arr,4,0,arr.length-1));
       System.out.println(arr[binarySearch(arr,4,0,arr.length-1)]);

   }

   public static int binarySearch(int[] arr,int key,int left,int right){
       if(key<arr[left]||key>arr[right]||left>right){
           return -1;
       }
       int middle=(left+right)/2;
       if(arr[middle]<key){
           return binarySearch(arr,key,middle+1,right);
       }else if(arr[middle]>key){
           return binarySearch(arr,key,left,middle-1);
       }else{
           return middle;
       }
   }
}


六、刪除多層文件夾(沒個文件夾中可能包含文件)

public static void delete(File file){
   if(file.isDirectory()){
       File[]  subs=file.listFiles();
       for(File sub:subs){
           delete(sub);
       }
   }
   file.delete();
}


2、動態規劃

一、最長公共子串

二、最長公共子序列

三、走網格問題

四、最大連續公共子串

五、字符串編輯距離

六、交錯字符串

七、子序列個數



3、揹包問題




1、串


1三、最長重複子串

    一個長度爲10000的字符串,寫一個算法,找出最長的重複子串,如abczzacbca,結果是bc。

    提示:此題是後綴樹/數組的典型應用,便是求後綴數組的height[]的最大值。


public String find(String str) {
    String reg, left;
    // 最長的重複字串,極端狀況就好比abcabc,最長重複字串就是abc
    // 即爲字符串長度的一半,固然這是極端狀況,一般都是小於串長一半的
    for (int len = str.length() / 2; len > 0; len--) {
        // 將字符串分隔爲若干「最長字串」
        for (int i = 0; i < str.length() / len; i++) {
            // 獲取「最長字串」
            reg = str.substring(0, len + 1);
            // 刨去「最長字串」剩下的串
            left = str.substring(len + 1);
            // 若是剩下的串裏面包含「最長字串」
            if (left.indexOf(reg) != -1)
                // bingo!
                return reg;
        }
    }
    // 啥也找不到就返回空吧
    return null;
}
相關文章
相關標籤/搜索