编程算法之动态规划之最长公共子序列(java版)
2012-04-04 10:00
513 查看
问题:给定的两串字符,要求变成求出最长公共子序列;
程序:
import java.util.Scanner;
public class LCS {
/**
* @param args
*/
public static void main(String[] args) { //可以实现用户自己输入两串字符:
// TODO Auto-generated method stub
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一串字符:");
String s1 = scanner.next();
System.out.println("请输入一串字符:");
String s2 = scanner.next();
int c[][] = new int [s1.length() + 1][s2.length() + 1];
int b[][] = new int [s1.length() + 1][s2.length() + 1];
sort(s1,s2,c,b);
}
public static void sort(String s1,String s2,int c[][],int b[][]) { //该方法实现统计
int n = s1.length();
int m = s2.length();
char array1[] = s1.toCharArray();
char array2[] = s2.toCharArray();
for(int i = 1; i <= n; i++) {
c[i][0] = 0;
}
for(int j = 1; j <= m; j++) {
c[0][j] = 0;
}
for(int i = 1; i <= n; i++) {
for(int j = 1 ; j <= m; j++ ) {
if(array1[i-1] == array2[j-1]) {
c[i][j] = c[i-1][j-1] + 1;
b[i][j] = 1;
}
else if(c[i-1][j] >= c[i][j-1]) {
c[i][j] = c[i-1][j];
b[i][j] = 2;
}
else {
c[i][j] = c[i][j-1];
b[i][j] =3;
}
}
}
System.out.println("最长子序列为:");
print_sort(n, m, array1, b);
}
public static void print_sort(int n,int m,char ch [],int b[][]) { //该方法根据统计函数所得结果实现
//输出
if(n == 0 || m ==0) return;
if(b
[m] == 1) {
print_sort(n-1, m-1, ch, b);
System.out.print(ch[n-1]);
}
else if(b
[m] == 2) {
print_sort(n-1, m, ch, b);
}
else
print_sort(n, m -1, ch, b);
}
}
程序:
import java.util.Scanner;
public class LCS {
/**
* @param args
*/
public static void main(String[] args) { //可以实现用户自己输入两串字符:
// TODO Auto-generated method stub
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一串字符:");
String s1 = scanner.next();
System.out.println("请输入一串字符:");
String s2 = scanner.next();
int c[][] = new int [s1.length() + 1][s2.length() + 1];
int b[][] = new int [s1.length() + 1][s2.length() + 1];
sort(s1,s2,c,b);
}
public static void sort(String s1,String s2,int c[][],int b[][]) { //该方法实现统计
int n = s1.length();
int m = s2.length();
char array1[] = s1.toCharArray();
char array2[] = s2.toCharArray();
for(int i = 1; i <= n; i++) {
c[i][0] = 0;
}
for(int j = 1; j <= m; j++) {
c[0][j] = 0;
}
for(int i = 1; i <= n; i++) {
for(int j = 1 ; j <= m; j++ ) {
if(array1[i-1] == array2[j-1]) {
c[i][j] = c[i-1][j-1] + 1;
b[i][j] = 1;
}
else if(c[i-1][j] >= c[i][j-1]) {
c[i][j] = c[i-1][j];
b[i][j] = 2;
}
else {
c[i][j] = c[i][j-1];
b[i][j] =3;
}
}
}
System.out.println("最长子序列为:");
print_sort(n, m, array1, b);
}
public static void print_sort(int n,int m,char ch [],int b[][]) { //该方法根据统计函数所得结果实现
//输出
if(n == 0 || m ==0) return;
if(b
[m] == 1) {
print_sort(n-1, m-1, ch, b);
System.out.print(ch[n-1]);
}
else if(b
[m] == 2) {
print_sort(n-1, m, ch, b);
}
else
print_sort(n, m -1, ch, b);
}
}
相关文章推荐
- Java动态规划 实现最长公共子序列以及最长公共子字符串
- Java动态规划 实现最长公共子序列以及最长公共子字符串
- Java动态规划 实现最长公共子序列长度
- (基于Java)算法之动态规划——最长公共子序列
- Java动态规划 实现最长公共子序列以及最长公共子字符串
- 动态规划之最长公共子序列---java实现
- 最长公共子序列(LCS)动态规划解题笔记
- 动态规划-最长公共子序列
- 24点游戏动态规划解法(java)
- 动态规划之背包问题01--java实现
- 动态规划---LCS最长公共子序列
- 动态规划的典型分析与代码实现----主java
- 动态规划-最长公共子序列、最长公共子串
- 动态规划之最长公共子序列(Longest Common Subsequence)
- 动态规划--最长公共子序列
- 动态规划之最长公共子序列
- java实现矩阵连乘的动态规划
- 动态规划方法之最长公共子序列
- 动态规划入门策略—“最长公共子序列”
- 动态规划之最长公共子序列