算法(五)、遞歸&&動態規劃&&揹包問題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 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){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; }