LCS算法实现 求两个字符串中间最长的公共子串
2014-09-22 09:58
676 查看
package util;import java.util.ArrayList;import java.util.List;/** * LCS算法实现 求两个字符串中间最长的公共子串 * @author landing * */public class LCSImpl {public int getSameStr(String str1,String str2){char[] arrchar1 = str1.toCharArray();char[] arrchar2 = str2.toCharArray();int[][]
arr = new int[arrchar1.length][arrchar2.length];int len = arrchar1.length < arrchar2.length ? arrchar1.length : arrchar2.length;int maxarr[] = new int[len];int maxindex[] = new int[len];for(int i = 0; i<arrchar1.length; i++){for(int j = 0; j<arrchar2.length;
j++){if (arrchar2[j] == arrchar1[i]) {if (i == 0 || j == 0) {arr[i][j] = 1;if (maxarr[0] < 1) {maxarr[0] = 1;maxindex[0] = i;}} else {arr[i][j] = arr[i - 1][j - 1] + 1;// 如果当前求出的子串长度大于了maxarr中第一个数值 则清空maxarr数值 全部置0// 同时替换第一个最大值if (maxarr[0] < arr[i][j]) {maxarr[0]
= arr[i][j];maxindex[0] = i;for (int num = 1; num < maxarr.length; num++) {if (maxarr[num] == 0) {break;} else {maxarr[num] = 0;maxindex[num] = 0;}}} else if (maxarr[0] == arr[i][j]) {// 如果当前求出的子串长度跟maxarr中第一个一致 则保留int num = 0;for (int max : maxarr) {if (max
== 0) {maxarr[num] = arr[i][j];maxindex[num] = i;break;}num++;}}}} else {arr[i][j] = 0;}}}List list = new ArrayList();int longLength = 0;for (int i = 0; i < maxarr.length; i++) {if (maxarr[i] == 0) {break;}int num = maxindex[i] - (maxarr[i] - 1);String str
= "";for (int k = 0; k < maxarr[i]; k++) {char tempchar = arrchar1[num];str += String.valueOf(tempchar);num++;}// System.out.println(str);// System.out.println(str.length());list.add(str);}int temp = 0;for (int i = 0; i < list.size(); ++i) {temp = list.get(i).length();if
(temp > longLength) {longLength = temp;}}return longLength;}/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stub}}
arr = new int[arrchar1.length][arrchar2.length];int len = arrchar1.length < arrchar2.length ? arrchar1.length : arrchar2.length;int maxarr[] = new int[len];int maxindex[] = new int[len];for(int i = 0; i<arrchar1.length; i++){for(int j = 0; j<arrchar2.length;
j++){if (arrchar2[j] == arrchar1[i]) {if (i == 0 || j == 0) {arr[i][j] = 1;if (maxarr[0] < 1) {maxarr[0] = 1;maxindex[0] = i;}} else {arr[i][j] = arr[i - 1][j - 1] + 1;// 如果当前求出的子串长度大于了maxarr中第一个数值 则清空maxarr数值 全部置0// 同时替换第一个最大值if (maxarr[0] < arr[i][j]) {maxarr[0]
= arr[i][j];maxindex[0] = i;for (int num = 1; num < maxarr.length; num++) {if (maxarr[num] == 0) {break;} else {maxarr[num] = 0;maxindex[num] = 0;}}} else if (maxarr[0] == arr[i][j]) {// 如果当前求出的子串长度跟maxarr中第一个一致 则保留int num = 0;for (int max : maxarr) {if (max
== 0) {maxarr[num] = arr[i][j];maxindex[num] = i;break;}num++;}}}} else {arr[i][j] = 0;}}}List list = new ArrayList();int longLength = 0;for (int i = 0; i < maxarr.length; i++) {if (maxarr[i] == 0) {break;}int num = maxindex[i] - (maxarr[i] - 1);String str
= "";for (int k = 0; k < maxarr[i]; k++) {char tempchar = arrchar1[num];str += String.valueOf(tempchar);num++;}// System.out.println(str);// System.out.println(str.length());list.add(str);}int temp = 0;for (int i = 0; i < list.size(); ++i) {temp = list.get(i).length();if
(temp > longLength) {longLength = temp;}}return longLength;}/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stub}}
相关文章推荐
- LCS算法找出两个字符串最长公共子串(C#实现)
- 实用算法实现-第 8 篇 后缀树和后缀数组 [3 两个字符串的最长公共子串]
- 实用算法实现-第 8 篇 后缀树和后缀数组 [3 两个字符串的最长公共子串]
- python实现求两个字符串的最长公共子串
- 两个字符串最长公共子串-LCS问题
- 求两个字符串最长公共子串LCS
- 给出两个字符串,找到最长公共子串,并返回其长度,java实现
- 【每天学点算法题10.15】获取两个字符串之间最长公共子串的长度
- 求两个字符串最长公共子串(LCS问题)
- JavaScript自定义函数实现查找两个字符串最长公共子串的方法
- LCS (Longest Common Subsequence) 字符串最长公共子串算法
- 利用后缀数组求字符串的最长重复子串的算法 利用二维数组求两个字符串的最长公共字串(动态规划)
- 求两个字符串的最长公共子串(LCS)
- LCS两个字符串最长公共子串
- SPOJ 1811. Longest Common Substring (LCS,两个字符串的最长公共子串, 后缀自动机SAM)
- 求两个字符串最长公共子串(LCS问题) 两种思想
- 求两个字符串的最长公共子串(LCS)
- 求两个字符串中间最长的公共子串
- 【字符串处理算法】获取最长公共子串的算法设计及C代码实现
- 求两个字符串最长公共子串LCS(其它)