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+"个字符串符合要求。"); } }
就这样了,哎,还是要多做题啊
相关文章推荐
- [网易2018校招java笔试题]字符串碎片(java语言实现)
- 2016校招腾讯研发岗笔试题(第二题)用Java实现
- 网易2017校招内推笔试练习卷编程题2--出专辑
- 2017校招去哪网,阿里,网易,中兴,华为笔试编程题五则(Python描述)
- 【在线笔试题解题报告系列】网易2017校招内推笔试之编程题【持续更新】
- 网易2017内推笔试题(藏宝图)java解法
- 网易2017校招笔试
- 阿里巴巴校招2017前端笔试题目 -- 原生js/html5 实现一个路由
- 2017校招Java开发笔试题集
- 网易乐得 线下笔试 求第N个丑数 Java实现
- 网易2017招聘笔试题<下厨房>Java代码
- 8.12网易内推笔试题:小易喜欢的数列 java实现
- 网易2017校招C++开发工程师(北京)笔试
- 2017校招全国笔试第二唱
- 2015年网易校招Java开发工程师(技术架构)在线笔试题
- 2017年网易校招笔试编程题第二题
- 网易2017春招笔试<双核处理>Java代码
- (整理)Java实现链表--找到两个链表的第一个公共结点(网易笔试题2016)
- 京东2017实习校招笔试题目-异或实现
- 网易2017校招内推笔试练习卷编程题1--1019.数字黑洞20