java程序员面试笔试宝典代码题:求两个字符串的公共子串,同时找出最长的一个子串。一样长,就输出最前面的一个(大于一个字符的才算子串)

思路:

    1.首先对比两个串,找出长串和短串例如:长串是abcd,短串是abc

    2.以短串为基准,循环查询子串,看长串里面是否包含该子串(从短串abc中找子串:ab,abc,bc三个,看这些子串是不是在长串    中abcd中)

    3.把子串也在长串中的公共字符串都放入到集合list中存储

    4.在循环对比list集合中的每一个字符串的长度,记住最长的一个的下标index

    5.输出该下标对应的list.get(index)

测试代码如下:
@Test
	public void test1() {
		String str1 = "111111aaabbbccceeeeffffffffggghhh99999999999999999abc777777777777777555555";
		String str2 = "aabbbccccffggghheeaaaccbbbbcc999999999999999999999999ghg";
		String shortStr = str1.length() > str2.length() ? str2 : str1;
		String longStr = str1.length() > str2.length() ? str1 : str2;
		int index = 0;//最长字串的下标,是再list集合中的位置
		List list = new ArrayList();//新建一个集合来装我们的符合条件的字串
		for (int i = 0; i < shortStr.length() - 2; i++) {//循环查找字串,
			for (int j = i + 2; j < shortStr.length(); j++) {
				String same = shortStr.substring(i, j);
				if (longStr.indexOf(same) != -1) {
					list.add(same);//将公共字串放入到集合中
				}
			}
		}
		System.out.println(list);//输出所有公共字串
		int max = list.get(0).toString().length();//先假设集合中第一个串长度最长
		int tempmax;//一个过渡变量
		for (int i = 1; i < list.size(); i++) {
			if ((tempmax = list.get(i).toString().length()) > max) {
				max = tempmax;
				index = i;//记住最长字串的再集合中的位置
			}

		}
		System.out.println(list.get(index));//打印出该公共子串
	}

控制台打印如下:

 [aa, aab, aabb, aabbb, aabbbc, aabbbcc, aabbbccc, ab, abb, abbb, abbbc, abbbcc, abbbccc, bb, bbb, bbbc, bbbcc, bbbccc, bb, bbc, bbcc, bbccc, bc, bcc, bccc, cc, ccc, cc, ccc, cc, ff, ffg, ffgg, ffggg, ffgggh, ffggghh, fg, fgg, fggg, fgggh, fggghh, gg, ggg, gggh, ggghh, gg, ggh, gghh, gh, ghh, hh, ee, aa, aaa, aa, cc, bb, bbb, bb, bbb, bbbc, bbbcc, bb, bbc, bbcc, bc, bcc, cc, 99, 999, 9999, 99999, 999999, 9999999, 99999999, 999999999, 9999999999, 99999999999, 999999999999, 9999999999999, 99999999999999, 999999999999999, 9999999999999999, 99999999999999999, 99, 999, 9999, 99999, 999999, 9999999, 99999999, 999999999, 9999999999, 99999999999, 999999999999, 9999999999999, 99999999999999, 999999999999999, 9999999999999999, 99999999999999999, 99, 999, 9999, 99999, 999999, 9999999, 99999999, 999999999, 9999999999, 99999999999, 999999999999, 9999999999999, 99999999999999, 999999999999999, 9999999999999999, 99999999999999999, 99, 999, 9999, 99999, 999999, 9999999, 99999999, 999999999, 9999999999, 99999999999, 999999999999, 9999999999999, 99999999999999, 999999999999999, 9999999999999999, 99999999999999999, 99, 999, 9999, 99999, 999999, 9999999, 99999999, 999999999, 9999999999, 99999999999, 999999999999, 9999999999999, 99999999999999, 999999999999999, 9999999999999999, 99999999999999999, 99, 999, 9999, 99999, 999999, 9999999, 99999999, 999999999, 9999999999, 99999999999, 999999999999, 9999999999999, 99999999999999, 999999999999999, 9999999999999999, 99999999999999999, 99, 999, 9999, 99999, 999999, 9999999, 99999999, 999999999, 9999999999, 99999999999, 999999999999, 9999999999999, 99999999999999, 999999999999999, 9999999999999999, 99999999999999999, 99, 999, 9999, 99999, 999999, 9999999, 99999999, 999999999, 9999999999, 99999999999, 999999999999, 9999999999999, 99999999999999, 999999999999999, 9999999999999999, 99999999999999999, 99, 999, 9999, 99999, 999999, 9999999, 99999999, 999999999, 9999999999, 99999999999, 999999999999, 9999999999999, 99999999999999, 999999999999999, 9999999999999999, 99, 999, 9999, 99999, 999999, 9999999, 99999999, 999999999, 9999999999, 99999999999, 999999999999, 9999999999999, 99999999999999, 999999999999999, 99, 999, 9999, 99999, 999999, 9999999, 99999999, 999999999, 9999999999, 99999999999, 999999999999, 9999999999999, 99999999999999, 99, 999, 9999, 99999, 999999, 9999999, 99999999, 999999999, 9999999999, 99999999999, 999999999999, 9999999999999, 99, 999, 9999, 99999, 999999, 9999999, 99999999, 999999999, 9999999999, 99999999999, 999999999999, 99, 999, 9999, 99999, 999999, 9999999, 99999999, 999999999, 9999999999, 99999999999, 99, 999, 9999, 99999, 999999, 9999999, 99999999, 999999999, 9999999999, 99, 999, 9999, 99999, 999999, 9999999, 99999999, 999999999, 99, 999, 9999, 99999, 999999, 9999999, 99999999, 99, 999, 9999, 99999, 999999, 9999999, 99, 999, 9999, 99999, 999999, 99, 999, 9999, 99999, 99, 999, 9999, 99, 999, 99, gh]
                           最长的公共字串为:                                                             99999999999999999



猜你喜欢

转载自blog.csdn.net/handsome2013/article/details/81001871