標籤:style blog http color strong os
1,兩個字串的最長公用子串
基本思想是掃描兩次矩陣,第一次進行字元比較;第二次找出對角線為1的最長長度
package com.bobo.interview;import com.bobo.util.MetrixPrint;/** * 這個類實現的功能室尋找兩個字串的最長公用子串(要求連續) * 掃描兩次矩陣,第一次的時候是兩個字串的比較,相等的位置賦值1,不等的位置賦值0 * 第二次掃描,找出對角線為1的最大長度 * 需要注意的是:分支不止一個的情況 * @author weibo.lwb * */public class LargestCommonStr { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub LargestCommonStr test=new LargestCommonStr(); test.largestCommonStr("abce", "ebcen"); } public int largestCommonStr(String str1,String str2){ int n=str1.length(); int m=str2.length(); int metrix[][]=new int[n][m]; //第一遍掃描,兩個字串相等的地方賦值1,否則賦值為0 for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ if(str1.charAt(i)==str2.charAt(j)){ metrix[i][j]=1; }else{ metrix[i][j]=0; } } } System.out.println("第一次掃描之後構建的矩陣為:"); for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ System.out.print(metrix[i][j]+" "); } System.out.println(); } int max=0; int xpos=0; int ypos=0; //第二遍掃描,看上個矩陣對角線為1的最大長度 for(int i=1;i<n;i++){ for(int j=1;j<m;j++){ if(metrix[i-1][j-1]>=1&&metrix[i][j]>=1){ metrix[i][j]=metrix[i-1][j-1]+1; if(max<metrix[i][j]){ max=metrix[i][j]; xpos=i; ypos=j; } } } } System.out.println("第2次掃描之後構建的矩陣為:"); for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ System.out.print(metrix[i][j]+" "); } System.out.println(); } //兩次掃描之後完成,之後需要做的是輸出公用子串 System.out.println("最長公用子串的長度為:"+max); System.out.println(str1.substring(xpos-max+1,xpos+1)); return max; } }最長公用子串
2,兩個字串的最長公用子序列
基本思想,注意這裡是構建一個(len1+1)*(len2+1)的矩陣
利用動態規劃的遞推公式:
f(i,j)=f(i-1,j-1)+1 如果str1[i]=str2[j]
f(i,j)=max{f(i-1,j),f(i,j-1)}如果str1[i]!=str2[j]
對於該矩陣賦予的初值是第一行和第一列都等於0
package com.bobo.interview;import com.bobo.util.MetrixPrint;/** * 該類主要是實現計算兩個字串的最長公用子序列(不要求連續) * 採用動態規劃的方法 * @author weibo.lwb * */public class LargestCommonList { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub LargestCommonList test=new LargestCommonList(); test.largestCommonList("agbic", "abcmn"); } public static int largestCommonList(String str1,String str2){ int len1=str1.length(); int len2=str2.length(); int[][] result=new int[len1+1][len2+1]; for(int i=0;i<=len1;i++){ result[i][0]=0; } for(int j=0;j<=len2;j++){ result[0][j]=0; } for(int i=1;i<=len1;i++){ for(int j=1;j<=len2;j++){ if(str1.charAt(i-1)==str2.charAt(j-1)){ System.out.print(str1.charAt(i-1)); result[i][j]=result[i-1][j-1]+1; }else{ result[i][j]=result[i-1][j]>result[i][j-1]?result[i-1][j]:result[i][j-1]; } } } System.out.println(); MetrixPrint.printMetrix(result); return result[len1][len2]; }}最長公用子序列
3,計算2的n次方
動態規劃,減少計算次數
package com.bobo.interview;public class cal2mi { /** * @param args */ public static void main(String[] args) { cal2mi test=new cal2mi(); System.out.println(test.cal2byn(3)); System.out.println(test.cal2byn(10)); } public static int cal2byn(int n){ if(n==0){ return 1; } if(n==1){ return 2; } if(n%2==0){ return cal2byn(n/2)*cal2byn(n/2); }else { return 2*cal2byn((n-1)/2)*cal2byn((n-1)/2); } }}計算2的n次方
4,計算所有的全排列
4,計算字典序的全排列