牛客模拟

牛牛有两个字符串(可能包含空格),牛牛想找出其中最长的公共连续子串,希望你能帮助他,并输出其长度。

输入描述:
输入为两行字符串(可能包含空格),长度均小于等于50.


输出描述:
输出为一个整数,表示最长公共连续子串的长度。

输入例子:
abcde
abgde

输出例子:
2

思路:LCS可以是连续的,也可以是不连续的,他们在构造DP的时候有些不同,

如果是连续的,那么dp[i][j] 表示s1的前i位和s2的前j位正好对上的最大公共子串,这样才能满足连续子串的条件,才能把之前的dp用起来

而如果LCS是不连续的,dp[i][j] 表示s1到i为止,s2到j为止能满足的最大值


here is code

package l1;
import java.util.*;

/*
 * dp[i][j] 表示s1的前i位和s2的前j位正好对上的最大公共子串
 * 实际上就是后缀匹配上了
 * 
 * 注意与可以不连续的LCS的区别
 * 此外还有暴力解法哟
 */
public class Main {
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while(sc.hasNext()) {
			String s1 = sc.nextLine(), s2 = sc.nextLine();
			
			int max = 0;
			int[][] dp = new int[s1.length()+1][s2.length()+1];
			for(int i=1; i<=s1.length(); i++)
				for(int j=1; j<=s2.length(); j++)
					if(s1.charAt(i-1) == s2.charAt(j-1)) {
						dp[i][j] = dp[i-1][j-1] + 1;
						max = Math.max(max, dp[i][j]);
					}
			
			System.out.println(max);
		}
	}

}

关于非连续的LCS,参见 http://blog.csdn.net/zjucor/article/details/65443719







牛牛在书上看到一种字符串叫做回文串,当一个字符串从左到右和从右到左读都是一样的,就称这个字符串为回文串。牛牛又从好朋友羊羊那里了解到一种被称为优美的回文串的字符串,考虑一个长度为N只包含大写字母的字符串,写出它所有长度为M的连续子串(包含所有可能的起始位置的子串,相同的子串也要计入),如果这个字符串至少有K个子串都是回文串,我们就叫这个字符串为优美的回文串。现在给出一个N,牛牛希望你能帮他计算出长度为N的字符串有多少个是优美的回文串(每个位置都可以是'A'~'Z'的一个。) 

输入描述:
输入数据包括三个整数N, M, K(2 ≤ N ≤ 11, 2 ≤ M ≤ N, 0 ≤ K ≤ 11).


输出描述:
输出一个整数,表示所求的字符串个数.

输入例子:
2 2 1

输出例子:
26
长度为2的字符串,它长度为2的子串只有它自身。长度为2的回文串有"AA","BB","CC"..."ZZ",一共26种。

你可能感兴趣的:(面试题)