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


 S1  

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


C  T   A   C  A 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);
			}
		}
	}
}
结果如下:




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值