我现在正在我的大学学习 DFA 和 NFA 自动机以及如何使用 Java 代码实现其中的一些。
我在这个练习中遇到了一些麻烦:我们有 4 个不同的实验室回合(T1、T2、T3 和 T4),我们需要编写代码来识别特定的字符串(由学生的大学徽章编号和他的名称,例如,123321Johnson
) 对应于 T2 或 T3。
我们知道:
T1 轮到徽章编号和姓氏在“A”和“K”之间的奇数
T2是“A”和“K”之间偶数徽章数字和姓氏的轮换
T3是“L”和“Z”之间的奇数徽章号码和姓氏的轮换
T4是“L”和“Z”之间偶数徽章数字和姓氏的轮换
我们也知道字符串必须由至少一个数字和至少一个字母组成。
例如,自动机必须接受"1232324Gac"
or"1232323Lum"
但不接受"121234Lum"
or "121233Gac"
。
这是我写的代码:
import java.util.Scanner;
public class Es3 {
static Scanner sc = new Scanner(System.in);
String s = sc.next();
public static boolean scan(String s)
{
int state = 0;
int i = 0;
while (state >= 0 && i < s.length()) {
final char ch = s.charAt(i++);
switch (state) {
case 0:
if (ch >= 0 && ch <= 9)
state = 1;
else
state = -1;
break;
case 1:
if (ch >=0 && ch <=9)
state = 1;
else if (ch >='a' && ch <='k')
if ((s.charAt(i--))%2==0)
state = 2;
else
state = -1;
else if (ch >='l' && ch <='z')
if ((s.charAt(i--))%2==1)
state = 3;
else
state = -1;
else
state = -1;
break;
case 2:
if (ch >='a' && ch <='z')
state = 2;
else
state = -1;
break;
case 3:
if (ch >='a' && ch <='z')
state = 3;
else
state = -1;
break;
}
}
return (state == 2 || state == 3);
}
public static void main(String[] args)
{
System.out.println(scan(args[0]) ? "OK" : "NO");
}
}
显然,代码不起作用,但这对于展示练习的一般目的很重要。
有人可以帮助我吗?
哆啦的时光机
相关分类