算法编程题

2019京东春季校招笔试测试题二

/*题目:

 * 根据输入的要求输出值:

 * 第一行输入一个整数:m

 * 接下来m行输入m个字符串

 *  最后一行输入一个较长的字符串(长度小于10000),

 * 要求:

 *      求出最后一个长串的子串,且它的子串是m个字符串中某个或者全部字符串的子串的个数

 *    《子串不能有交叉;(如: aabbc 的字串: a b c )因为.aa:与a有交叉,bbc与b有交叉》

 * 结果:输出满足条件的字串的个数。

如输入:

3

aa

b

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 li=new ArrayList();

for(int i=0;i

li.add(sc.next());

}

//找出前n个串中的最大长度即为字串的最大长度

int count=0;

for(String str:li) {

if(str.length()>count) {

count=str.length();

}

}

//去找最后一个串的子串, 子串最大长度为count

List lis=new ArrayList();//存它所以的子串,满足没有交叉

//从字串长度为1开始取

String lastStr=li.get(li.size()-1);

char[] la=lastStr.toCharArray();

for(int i=1;i<=count;i++) {

//取串

for(int j=0;j

StringBuilder strB=new StringBuilder();

//子串长度

for(int n=0;n

strB.append(la[j+n]);

}

j=j+i-1;

lis.add(strB.toString());

}

}

int total=0;

List newLis=new ArrayList();//存子串,二次筛选没有交叉的找到满足没有交叉的子串(所以感觉第一次筛选一次的目的,就是为了减少点运行时间,这儿也可以一并筛选的)

newLis.add(lis.get(0));

s:for(int j=1;j

for(int i=0;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

if(li.get(i).contains(s) && li.get(i).length()>=s.length()) {

total++;

continue s;

}

}

}

System.out.println(total);

}

    }

}

 

------

在本地IDE上写完后自己感觉应该没问题,提交代码的时候,老是不对。最后检查出来, 

 我代码体中当时为了查看数据,中间写了一个测试打印,结果调试编译不对。   发现的时候,时间到了,已经没时间改了。

 

惨痛的教训,望以后面试的一定要注意呀。

 

你可能感兴趣的:(算法)