S1
i --------------->
G | C | C | C | T | A | G | C | C | A | G | D | E |
S2
j --------------->
G | C | G | C | C | A | G | T | G | D | E |
思路分析:定义两个指针 i和 j 。i指向S1 的首位,j指向S2的首位;然后定义int 临时长度变量 temp 和 最大相等子字符串长度 int length
接着进行循环遍历。当i对应的值等于j对应的值的时候,继续判断指针后面的值是否相等,如果相等一方面继续向后判断,另一方面记录相同子字符串的个数。如果不等的话,那么程序接着循环遍历
实例分析:
上述题目中,我们发现 i=0 和j=0 对应的值是相等的。那么临时变量加一,接着判断下一个值。i=1 和j=1 的值,我们发现继续相等。临时值temp继续加一。等到发现不相等的时候。判断临时值temp 和 length 的长度,如果临时值temp 比length的长度大的话,将temp 赋值给length。接着,我们的指针从 i=0 和 j=1 开始进行。重复上述操作。当j遍历完之后的话。那么接着i向后挪动一位。接着结算。直到i遍历完。
package com.demo;
/**
* @description 求两个字符串最长公共字串长度
* @author xiong
*
*/
public class Main {
private String[] mArr_a = new String[] { "G", "C", "C", "T", "A", "G", "C",
"C", "A","G","D","E" };
private String[] mArr_b = new String[] { "G", "C", "G", "C", "C", "A", "G",
"T", "G", "D", "E" };
private int mTemp;
private int mLength = 0;
private String mSub="";
public static void main(String[] args) {
Main m = new Main();
m.start();
System.out.println("last:" + m.mLength);
}
/**
* 开始遍历
*/
public void start() {
for (int i = 0; i < mArr_a.length; i++) {
for (int j = 0; j < mArr_b.length; j++) {
mTemp = 0;
mSub="";
list(i, j);
if (mTemp > mLength) {
mLength = mTemp;
System.out.println("length:" + mLength+" sub:"+mSub);
}
}
}
}
/**
*
* @param i
* @param j
*/
public void list(int i, int j) {
if (i < mArr_a.length && j < mArr_b.length) {
if (mArr_a[i].equals(mArr_b[j])) {
mTemp++;
mSub+=mArr_a[i];
list(i + 1, j + 1);
}
}
}
}
结果如下: