import java.util.HashMap; import java.util.Map; /** * Created by tangtang on 15/6/22. */ public class LongSubString { public static void main(String[] args) { String src="abcdefgh"; String dest="cbdef"; } /** * 第一种方法 暴力求解 这个 很简单 * */ public static String longSubString(String src,String dest) { String maxString=""; for (int i=0;i<src.length();i++) { for (int j=0;j<dest.length();j++) { int temp; if (dest.charAt(j)==src.charAt(i)) { //这里开始记录 String tempMax=dest.charAt(j)+""; int l=1; for (int h=j+1;h<dest.length();h++,l++) { if ((i+l)<src.length()&&src.charAt(i+l)==dest.charAt(h)) { tempMax+=dest.charAt(h); }else { break; } } if (maxString.length()<tempMax.length()) { maxString=tempMax; } } } } return maxString; } /** * 动态规划 * 思想:很简单 分成str1长度个子问题 * 如果 s1[i]!=s1[j] 则把当前len清0 longest用于记录总最大长度 * 否则 m n 各自++ 严格的说 这个和上边的是一样的 不同实现而已 */ public static int longestCommonSubstring(String str1,String str2) { return compute(str1.toCharArray(), str2.toCharArray()); } public static int compute(char[] str1,char[] str2) { int len1=str1.length; int len2=str2.length; int start1=-1; int start2=-1; int longest=0; for (int i=0;i<str1.length;i++) { int m=i; int n=0; int length = 0; while (m<len1&&n<len2) { if (str1[m]!=str2[n]) //满足条件 { length=0; //不满足清0 }else { length++; if (longest<length) { longest=length; start1 = m - longest + 1; start2 = n - longest + 1; } } } } // shift string2 to find the longest common substring for (int j = 1; j < len2; ++j) { int m = 0; int n = j; int length = 0; while (m < len1 && n < len2) { if (str1[m] != str2[n]) { length = 0; } else { ++length; if (longest < length) { longest = length; start1 = m - longest + 1; start2 = n - longest + 1; } } ++m; ++n; } } System.out.printf("from %d of str1 and %d of str2, compared for %d times\n", start1, start2); return longest; } }
动态规划 最长子序列问题
/** * Created by tangtang on 15/6/22. */ public class LongestSubSequence { public static void main(String[] args) { String[] x = {"","A", "B", "C", "B", "D", "A", "B"}; String[] y = {"", "B", "D", "C", "A", "B", "A"}; int[][] b = getLength(x, y); Display(b, x, x.length-1, y.length-1); } public static int[][] getLength(String[] str1,String[] str2) { int [][]b=new int[str1.length][str2.length]; int c[][]=new int[str1.length+1][str2.length+1]; for (int i=0;i<str1.length;i++) { c[i][0]=0; } for (int j=0;j<str2.length;j++) { c[0][j]=0; } for (int i=1;i<str1.length;i++) { for (int j=1;j<str2.length;j++) { if (str1[i]==str2[j]) { b[i][j]=0; c[i][j]=c[i-1][j-1]+1; }else if (c[i-1][j]>c[i][j-1]) { b[i][j]=1; c[i][j]=c[i-1][j]; }else { b[i][j]=2; c[i][j]=c[i][j-1]; } } } return b; } public static void Display(int[][] b, String[] x, int i, int j) { if (i==0||j==0) return; if (b[i][j]==0) { Display(b, x, i-1, j-1); System.out.print(x[i] + " "); }else if (b[i][j]==1) { Display(b,x,i-1,j); }else { Display(b,x,i,j-1); } } }