这题其实就是一个双向挖洞的问题,只要找到开头的点,然后往两边挖就得到结果了,由于第一个不扔掉的是特殊的,所以它有两种选择,向左或向右,其他的就卡死了。
举个例子
12345
4237
1先去找,没找到,抛弃。
2去找,找到了542367,同时2已经找过了,置-1,由于2两边都不是-1,所以它可以使左插入,也可以是右插入,是特殊的。
3去找,找到了,发现-1在它左边,所以3是插入到是右边,3置为-1
4去找,找到了,发现-1在它的右边,所以4是插入到左边,4置为-1
5去找,没找到,丢弃。
这时候不能直接输出,要检查一遍看看4237里面有没有没置为-1的。有,就证明赢不了。
接下来就是输出了,第一个没被抛弃的要用两次,分别是l和r
import java.util.Arrays;
import java.awt.Point;
import java.math.BigDecimal;
import java.util.*;
public class Main {
public static int sum=0;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n=sc.nextInt();
for (int i = 0; i < n; i++) {
int[] array = Arrays.stream(sc.next().split("")).mapToInt(Integer::parseInt).toArray();
int[] array1 = Arrays.stream(("0"+sc.next()+"0").split("")).mapToInt(Integer::parseInt).toArray();
char[] arr=new char[array.length];
int key=0;
kk: for (int j = 0; j < array.length; j++) {
for (int k = 1; k< array1.length-1; k++)
if(array[j]==array1[k] )
{
arr[j]='0';
key=j+1;
array1[k]=-1;
break kk;
}
arr[j]='d';
}
for (int j = key; j < array.length; j++) {
for (int k = 1; k< array1.length-1; k++)
if(array1[k]==array[j])
{ array1[k]=-1;
if(array1[k+1]==-1)
arr[j]='l';
else if(array1[k-1]==-1)
arr[j]='r';
}
arr[j]='d';
}
int key1=0;
for (int j2 = 0; j2 < array1.length; j2++)
if(array1[j2]==-1)
key1++;
System.out.println("{");
if(key1==array1.length-2)
{
for (int k = 0; k < arr.length; k++)
if(arr[k]=='0')
System.out.print("r"+" ");
else
System.out.print(arr[k]+" ");
System.out.println();
for (int k = 0; k < arr.length; k++)
if(arr[k]=='0')
System.out.print("l"+" ");
else
System.out.print(arr[k]+" ");
System.out.println();
}
System.out.println("}");
}
}
}
代码还可以,不直接找,弄个left和right,每个数就跟这俩比。
int[] array1 = Arrays.stream(("0"+sc.next()+"0").split("")).mapToInt(Integer::parseInt).toArray();
加粗的地方是我常用的消除边界的办法,这样就不用管数组是不是越界了!