这个问题,我一开始用KMP算法正一遍,反一遍找匹配字符串后对应输出的啊 ,而且第二次看到的旗帜一定要在第一次看到的旗帜后面这点也考虑到了,数组越界也考虑了,但是提示Wrong Answer,好像是说全部未通过,示例都能通过至少也不该是0%吧,这里的KMP算法通过了牛客网的测试用例的函数 import java.util.Scanner; public class Main { public static int[] getPMT(char[] b,int lenb){ int[] arr=new int[lenb]; arr[0]=0; int i=0,j=-1; while(i<lenb-1){ if(j==-1 || b[i]!=b[j]){ i++; j++; if(b[i]==b[j]){ arr[i]=j+1; } else{ arr[i]=0; j=-1; } } else{ i++; j++; if(b[i]!=b[j]){ i--; j=-1; } else{ arr[i]=j+1; } } } return arr; }          public static int findAppearance(String A, int lena, String B, int lenb,int mark) {         // write code here         if(lena<lenb)return -1; char[] a=A.toCharArray(); char[] b=B.toCharArray(); int[] pmt=getPMT(b,lenb); //new int[lenb];  //部分匹配表 int i=mark;  //左对齐下标 int j=0;  //内标 while(i<=lena-lenb){ while(j<lenb){ if(a[i]!=b[j]){ if(j==0)i++; else{ i-=pmt[j-1]; } j=0; break; } else{ i++; j++; if(j==lenb)return i-lenb;  //返回对齐的字符串头位置 } } } return -1;  //无匹配则返回-1     }          public static int check(int nA,int nB,int nA2,int nB2,int lA){     if((nB-nA)>=lA && nA!=-1 && nB!=-1){ if((nB2-nA2)>=lA && nA2!=-1 && nB2!=-1){ return 3;  //表示both } else{ return 1;  //表示forward } }     else if((nB2-nA2)>=lA && nA2!=-1 && nB2!=-1){     return 2;  //表示backward     }     return 4;  //表示invalid     } public static void main(String[] args) {   Scanner sc=new Scanner(System.in); String C=sc.nextLine();  //正序路径 int lC=C.length(); char[] c=C.toCharArray(); String C2=""; for(int i=0;i<lC;i++){ C2+=c[lC-1-i]; } String A=sc.nextLine(); String B=sc.nextLine(); int nA,nB; int nA2,nB2; nA=findAppearance(C,lC,A,A.length(),0); nB=findAppearance(C,lC,B,B.length(),nA+A.length()); nA2=findAppearance(C2,lC,A,A.length(),0); nB2=findAppearance(C2,lC,B,B.length(),nA2+A.length()); int re=check(nA,nB,nA2,nB2,A.length()); if(re==1)System.out.println("forward"); else if(re==2)System.out.println("backward"); else if(re==3)System.out.println("both"); else if(re==4)System.out.println("invalid");     }   }
点赞 1

相关推荐

我要娶个什么名:学长你电脑闹鬼了
点赞 评论 收藏
分享
牛客网
牛客网在线编程
牛客网题解
牛客企业服务