解题思路:
FILO的思想,大概率使用栈来计算。利用栈将第一个值来进行一次加入,看看每次in之后是否符合出车的状况,如果符合就改变top的值,类似出栈
注意事项:
输出数组的索引j严格等于2n,只有满了才说明符合条件,不满那就肯定是不对。同时通过的车的数量不等于已有车的数量,要注意
参考代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
int n = scanner.nextInt();
String o1 = scanner.next();
String o2 = scanner.next();
int flag = 1;
char[] stack = new char[n]; // o1模拟栈
String[] l = new String[2 * n]; // in还是out的表示
int top = -1, j = 0, i = 0; // top表示栈顶,j是输出内容的索引,i是o2的索引
for (int k = 0; k < n; k++) {
// 为啥是i % o1.length(),这个说明n可能是要大于o1的长度的,所以要取余,比如4,123,那么进入的顺序其实是123 1
stack[++top] = o1.charAt(k % o1.length()); // 将o1的第n个字符入栈,同时栈顶指针加一,实时更新栈顶
l[j++] = "in"; // 表示入栈,汽车进入车站
while (top >= 0 && stack[top] == o2.charAt(i % o1.length())) { //
// top >= 0 表示栈不为空,stack[top] == o2.charAt(i) 表示栈顶元素和o2的第i个元素相等
// 初始时i为0,表示o2的第一个元素,如果栈顶元素和o2的第一个元素相等,那么就出栈
// 那么下次与o2的第二个元素比较,如果相等,那么就出栈,以此类推
top--; // 栈顶元素出栈
i++; // o2的索引加一
l[j++] = "out"; // 表示出栈
}
}
// 为啥是j 严格等于 2 * n,因为最后的输出是2 * n个,比如123,321,那么最后的输出是in in in out out out
// 反正就是当输出数组没满的时候,就说明啥,说明其实是不可以的.因为如果一出一进,j必然是能满足2n
// 如果中途缺少东西了,那么说明实际上是不可以的
if (j != 2 * n) {
flag = 0;
System.out.println("No.");
}
if (flag == 1) {
System.out.println("Yes.");
for (String value : l) {
System.out.println(value);
}
}
System.out.println("FINISH");
System.out.println(j);
}
}
}0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复