两字符串求最长公共子字符串

来源:互联网 发布:linux系统日志路径 编辑:程序博客网 时间:2024/05/01 13:05


 S1  

 i   --------------->

C C C  T   A  G  C C  AG  D E


S2

 j   --------------->

GCGCCAGTGDE

思路分析:定义两个指针 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);}}}}
结果如下:




原创粉丝点击