百度2015测试开发面试:两个字符串的最长公共子序列

百度面试碰到的一道题:

给定两个字符串a,b,输出两个字符串的最长公共子序列;

如String a = "abcabcde";String  b = "bcd123bcde",那么二者的最长公共子序列就是"bcde"。


package com.liuhao.acm.exam;

public class LongestComSub {

	public String getLongestComSub(String str1, String str2) {
		String longestStr = "";// 始终存放最长的子序列
		int maxLen = 0;// 存放最长子序列的长度

		for (int i = 0; i < str1.length(); i++) {
			String tempStr = "";// 存放本次遍历中的最长子序列
			int tempMax = 0;// 存放本次遍历最长子序列的长度
			int index = i;// 保存i的副本
			boolean eq = false;// 标记是否有公共子序列

			for (int j = 0; j < str2.length(); j++) {
				// 若当前字符相同,则index++
				if (index < str1.length() && str1.charAt(index) == str2.charAt(j)) {
					tempStr += str1.charAt(index);// 将当前字符添加到tempStr
					index++;
					tempMax++;
					eq = true;

					// maxLen中总是存放最长序列的长度
					if (tempMax > maxLen) {
						maxLen = tempMax;
						longestStr = tempStr;
					}

				}
				// 若不相等
				else {
					// 将第一个字符串的索引指向初始位置
					index = i;
					tempStr = "";
					tempMax = 0;

					//j要-1,否则会跳掉一个字符
					if (eq) {
						j--;
					}
					eq = false;
				}
			}

		}

		return longestStr;
	}

	public static void main(String[] args) {
		String str1 = "aaawwwwwaaaawaaaaaaa";
		String str2 = "aaawa1aaaaaaa";

		System.out.println(new LongestComSub().getLongestComSub(str1, str2));
	}
}

代码只返回了一个最长的公共子序列,若存在多个等长的,可以放在一个list里面,然后返回。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值