上编译原理老师出的一道题:判断字符能否被有穷自动机接收
public class Test {
public static void main(String[] args) {
int[][] matrix = new int[][]{{2,1,-1,-1},{3,1,-1,-1},{-1,5,2,4},{-1,6,2,4},{3,1,-1,-1},{-1,5,-1,-1},{-1,5,-1,-1}};
int[] ends = new int[]{4,5,6};
String a = "ad";
DFADemo dfaDemo = new DFADemo();
System.out.println(dfaDemo.getResult(ends,matrix,a));
}
}
public class DFADemo {
char[] arr = new char[]{'a','b','c','d'};
private int[][] matrix;
private int[] ends;
private int start,end;
private String str;
public DFADemo(){
}
public boolean getResult(int[] ends,int[][] matrix,String str){
for (int i = 0; i < ends.length; i++) {
this.ends = ends;
this.matrix = matrix;
this.str = str;
start = 0;
end = ends[i];
boolean b = result(str);
if (b == true){
return b;
}
}
return false;
}
public boolean result(String str){
char[] strs = new char[str.length()];
for (int i = 0; i < str.length(); i++) {
strs[i] = str.charAt(i);
}
int a = start;
for (int i = 0; i < strs.length&&a!=-1; i++) {
int next = Getnext(a,strs[i]);
a = next;
}
if (a != -1 && a==end){
return true;
}else {
return false;
}
}
private int Getnext(int a, char str) {
for (int i = 0; i < arr.length; i++) {
if (arr[i] == str){
if (matrix[a][i] != -1){
return matrix[a][i];
}
}
}
return -1;
}
}