微软面试100题 - 56LCS

来源:互联网 发布:2017淘宝大学视频教程 编辑:程序博客网 时间:2024/06/06 02:21


56.最长公共字串(算法、字符串)。

题目:如果字符串一的所有字符按其在字符串中的顺序出现在另外一个字符串二中,

则字符串一称之为字符串二的子串。

注意,并不要求子串(字符串一)的字符必须连续出现在字符串二中。
请编写一个函数,输入两个字符串,求它们的最长公共子串,并打印出最长公共子串。

例如:输入两个字符串BDCABA和ABCBDAB,字符串BCBA和BDAB都是是它们的最长公共子串,
则输出它们的长度4,并打印任意一个子串。

分析:求最长公共子串(Longest Common Subsequence, LCS)是一道非常经典的动态规划题,

因此一些重视算法的公司像MicroStrategy都把它当作面试题。

package com.interview.algorithm;public class PrintPremutation {/* * 53.字符串的排列(字符串)。题目:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。当c[i-1] == c2[j-1],取对角线+1。        当c[i-1] != c2[j-1],取上边或则左边的最大值。当i=0,j=0,CLS的长度为0。分析:这是一道很好的考查对递归理解的编程题,因此在过去一年中频繁出现在各大公司的面试、笔试题中。 */public void length(int[][] l, int[][] p, char[] c1, char[] c2){//int[][] l = new int[c1.length+1][c2.length+1];//int[][] p = new int[c1.length+1][c2.length+1];for(int i = 1; i <= c1.length; i++){for(int j = 1; j <= c2.length; j++){if(c1[i-1] == c2[j-1]){l[i][j]=l[i-1][j-1]+1;p[i][j]=1;}else if(l[i-1][j] >= l[i][j-1]){l[i][j] = l[i-1][j];p[i][j] =-1;}else if(l[i-1][j]<l[i][j-1]){l[i][j] = l[i][j-1];p[i][j] = 0;}}}}public void printLCS(int[][] p, char[] c1,int x, char[]c2, int y){if(x==0 || y==0) return;if(p[x][y] == 1){this.printLCS(p, c1, x-1, c2, y-1);System.out.print(c1[x-1]);}else if(p[x][y] == -1){this.printLCS(p, c1, x-1, c2, y);}else if(p[x][y] ==  0){this.printLCS(p, c1, x, c2, y-1);}}public static void main(String[] args) {// TODO Auto-generated method stubPrintPremutation print = new PrintPremutation();char[] c1 = "BDCABA".toCharArray();char[] c2 = "ABCBDAB".toCharArray();int[][] l = new int[c1.length+1][c2.length+1];int[][] p = new int[c1.length+1][c2.length+1];print.length(l, p, c1, c2);print.printLCS(p, c1, c1.length, c2, c2.length);//System.out.println(max);}}




0 0
原创粉丝点击