本文共 1650 字,大约阅读时间需要 5 分钟。
2019京东春季校招笔试测试题二
/*题目:
* 根据输入的要求输出值:
* 第一行输入一个整数:m
* 接下来m行输入m个字符串
* 最后一行输入一个较长的字符串(长度小于10000),
* 要求:
* 求出最后一个长串的子串,且它的子串是m个字符串中某个或者全部字符串的子串的个数
* 《子串不能有交叉;(如: aabbc 的字串: a b c )因为.aa:与a有交叉,bbc与b有交叉》
* 结果:输出满足条件的字串的个数。
如输入:
3
aa
ac
bbaac
输入结果:3
*/
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()) {
int m=sc.nextInt();
List<String> li=new ArrayList<String>();
for(int i=0;i<m+1;i++) {
li.add(sc.next());
}
//找出前n个串中的最大长度即为字串的最大长度
int count=0;
for(String str:li) {
if(str.length()>count) {
count=str.length();
}
}
//去找最后一个串的子串, 子串最大长度为count
List<String> lis=new ArrayList<String>();//存它所以的子串,满足没有交叉
//从字串长度为1开始取
String lastStr=li.get(li.size()-1);
char[] la=lastStr.toCharArray();
for(int i=1;i<=count;i++) {
//取串
for(int j=0;j<lastStr.length()-i+1;j++) {
StringBuilder strB=new StringBuilder();
//子串长度
for(int n=0;n<i;n++) {
strB.append(la[j+n]);
}
j=j+i-1;
lis.add(strB.toString());
}
}
int total=0;
List<String> newLis=new ArrayList<String>();//存子串,二次筛选没有交叉的找到满足没有交叉的子串(所以感觉第一次筛选一次的目的,就是为了减少点运行时间,这儿也可以一并筛选的)
newLis.add(lis.get(0));
s:for(int j=1;j<lis.size();j++) {
for(int i=0;i<newLis.size();i++) {
if(lis.get(j).toCharArray()[0]==newLis.get(i).toCharArray()[newLis.get(i).toCharArray().length-1]) {
continue s;
}
}
newLis.add(lis.get(j));
}
//去遍历,看看满足是前m个串的子串这个条件不
s:for(String s:newLis) {
for(int i=0;i<li.size()-1;i++) {
if(li.get(i).contains(s) && li.get(i).length()>=s.length()) {
total++;
continue s;
}
}
}
System.out.println(total);
}
}
}
------
转载地址:http://zkkin.baihongyu.com/