您的位置:首页 > 理论基础 > 计算机网络

2017秋招,网易校招网络笔试第二题,java实现

2017-09-11 15:31 429 查看



拿到这个题第一时间我是懵逼的,最终也没做出来,不过后来继续思考,又找了找资料,思路就出来了。
首先是找到合法的括号序列。(这也是我的瓶颈,之前没接触过这种题,哎,太low了我。)
此处参考博客:http://blog.csdn.net/xiaohei00000/article/details/50859678
分析:给定数组n,求n对括号可以组成的括号序列。因为数字为n,所以每个字符串长度为2n,根据括号规则我们可以知道,在第1到第2n的任一个位置都满足:左括号的个数大于等于右括号的个数。所以,在位置k还剩余left个左括号和right个右括号如果left>0,则可以打印左括号;而right必须小于等于left,right<=left,否则不能打印右括号。当right==0 && left==0的时候,说明有了一个合法的序列,可以将其存储起来。
第二,用动态规划方法求最长公共子序列。参考博客:http://blog.chinaunix.net/uid-26548237-id-3374211.html
然后就没什么好介绍的了,代码上面都有,应该很好懂。
import java.util.Scanner;
import java.util.Vector;

/**
* Created by gentl on 2017/9/11.
*/
public class T2 {
/*求出和已知字符串长度相同的合法字符串
此处参考http://blog.csdn.net/xiaohei00000/article/details/50859678
*/
Vector<String> restore=new Vector<>();//声明数组,用来存放所有合法字符串

Vector<String> generateParenthesis(int n){
if(n<=0){
return restore;
}
generateParenthesisHelper(n,n,"");
return restore;
}
//递归构造合法的括号序列
void generateParenthesisHelper(int left,int right,String str){
if(right==0){
restore.add(str);
}
else{
if(left>0){
generateParenthesisHelper(left-1,right,str+"(");
}
if(right>left){
generateParenthesisHelper(left,right-1,str+")");
}
}
}
//用动态规划方法求最大的公共子序列的长度
static int lcsequence(String str1,String str2){
int len1=str1.length();
int len2=str2.length();
int[][] c=new int[len1+1][len2+1];
for(int row=0;row<=len1;row++){
c[row][0]=0;
}
for (int column=0;column<=len2;column++){
c[0][column]=0;
}
for(int i=1;i<=len1;i++){
for (int j=1;j<=len2;j++){
if(str1.charAt(i-1)==str2.charAt(j-1)){
c[i][j]=c[i-1][j-1]+1;
}
else {
c[i][j]=c[i][j-1]>c[i-1][j]?c[i][j-1]:c[i-1][j];
}
}
}
return c[len1][len2];
}
public static void main(String[] args){
Scanner in =new Scanner(System.in);
String str=in.next();
int len=str.length();
int num=len/2;
T2 t2=new T2();
Vector<String> vs=t2.generateParenthesis(num);
int count=vs.size();
int[] countLcs=new int[count];
int maxLcsLength=0;
for(int i=0;i<count;i++){
if(vs.elementAt(i).equals(str)) {
countLcs[i]=0;
}
else {
countLcs[i]=lcsequence(vs.elementAt(i),str);
if(countLcs[i]>maxLcsLength){
maxLcsLength=countLcs[i];
}
}
}
int simStrNum=0;
for(int i=0;i<count;i++){
if(countLcs[i]==maxLcsLength){
simStrNum++;
System.out.println(vs.elementAt(i));
}
}
System.out.println("最大公共子序列长度为:"+maxLcsLength+"\n"
+"共有"+simStrNum+"个字符串符合要求。");
}
}


就这样了,哎,还是要多做题啊
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息