查找两个字符串的最大字串和子串
2017-05-26 20:34
369 查看
关于查找两个字符串之间的最长子串和最长公共子序列。用的都是动态规划的方法,就是小地方有区别。
一,查找两个字符串之间的最长字串(这里是字串)
举个例子,str1="1234567";str2="1245";
最长公共字串就是1245,长度是4.
代码是(java实现):
二,查找两个字符串之间的最长子串(这里是子串)
举个例子,str1="1234567";str2="1245";
最长公共字串就是12或者45,长度是2.
一,查找两个字符串之间的最长字串(这里是字串)
举个例子,str1="1234567";str2="1245";
最长公共字串就是1245,长度是4.
代码是(java实现):
public class Demo1 { public static void main(String[] args) { String str1="1234567"; String str2="12345"; char[] aa = str1.toCharArray(); char[] bb = str2.toCharArray(); int a = str1.length(); int b = str2.length(); //建立一个二维数组存储数据 int[][] dp = new int[a][b]; dp[0][0] = aa[0]==bb[0]?1:0; //第一行的比较,行对应着b for(int i=1;i<b;i++){ dp[0][i] = Math.max(dp[0][j-1],aa[0] =bb[i]?1:0); } //第一列,列对应着a for(int i=1;i<a;i++){ dp[i][0] = Math.max(dp[i-1][0],aa[i]==bb[0]?1:0); } //余下的数据进行处理 for(int i=1;i<a;i++){ for(int j=1;j<b;j++){ //如果该点的横坐标和纵坐标相等,则比较的三个地方点的大小,否则比较两个点的大小 if(aa[i]==bb[j]){ dp[i][j]=Max(c[i-1][j],c[i][j-1],c[i-1][j-1]+1); } else dp[i][j]=Math.max(c[i-1][j], c[i][j-1]); } } //这个数组的最后一个数据,代表了这个最大公共字串的个数 System.out.println(dp[a-1][b-1]); } public static int Max(int a,int b,int c){ int temp=a; if(a<b){ temp=b; } return temp>c?temp:c; } }
二,查找两个字符串之间的最长子串(这里是子串)
举个例子,str1="1234567";str2="1245";
最长公共字串就是12或者45,长度是2.
public class Demo115 { public static void main(String[] args){ String str1 = "1234567"; String str2 = "23467"; char[] arr1 = str1.toCharArray(); char[] arr2 = str2.toCharArray(); int[][] dp = new int[arr1.length][arr2.length]; int max = 0; //第一行 for(int i=0;i<arr2.length;i++){ if(arr2[i]==arr1[0]){ dp[0][i] = 1; for(int j=i+1;j<arr2.length;j++){ dp[0][j] = 1; } break; } } //第一列 for(int i=0;i<arr1.length;i++){ if(arr1[i]==arr2[0]){ dp[i][0] = 1; for(int j=i+1;j<arr1.length;j++){ dp[j][0] = 1; } break; } } //余下的数据 for(int i=1;i<arr1.length;i++){ for(int j=1;j<arr2.length;j++){ if(arr2[j]==arr1[i]){ dp[i][j] = findMax(dp[i-1][j],dp[i][j-1],dp[i-1][j-1]+1); if(dp[i][j]>max){ max = dp[i][j]; } } else{ dp[i][j] = 0; } } } System.out.println(max); } public static int findMax(int a,int b,int c){ int temp = a>b?a:b; return c>temp?c:temp; } }
相关文章推荐
- 查找两个字符串中的最大公共子串
- 华为OJ 公共字串计算&&查找两个字符串a,b中的最长公共子串
- 查找两个字符串的最大相同子串
- 编程实现查找两个字符串的最大公共子串 示例:"aocdfe"和"pmcdfa"最大公共子串为"cfd"
- Java语言实现查找两个字符串的最大公共字串
- [C/C++笔面试]编程查找两个字符串中的最大公共子串
- c语言:查找两个字符串的最大公共子串
- 查找一个字符串中两个相同的最大的子串
- 编程查找两个字符串最大公共子串
- 求两个字符串的最大公共字串
- 找出两个字符串中最大公共子字符串,如"abccade","dgcadde"的最大子串为"cad"
- 求两个字符串的公共最大子字符串,如asdfsdkgf,kllsdkabc的最大子串为sdk
- 查找两个字符串的最长公共子串的Javascript函数
- 利用后缀数组求字符串的最长重复子串的算法 利用二维数组求两个字符串的最长公共字串(动态规划)
- Exe 求两个字符串的最大公共字串
- 找出两个字符串中最大的公共子串的简单实现
- 两个或N个字符串最大公共子串算法
- 两个或N个字符串最大公共子串算法
- 找出两个字符串的最大公共子串
- 求两个字符串中的最大相同子串 SubString