用java写的模式匹配,运行结果一直是错的,不知道问题出在哪,球球了

不知道哪里不对,结果一直是错的

public class BF{
 public static int bf_cmp(String S, String T){
  int m=T.length();//T长
  int n=S.length();//S长
  int i,j;//记录主串下一次比较起始位置
  for(i=0; i<m-n; i++) {
  j=0;
  while(j<n && T.charAt(i+j)==S.charAt(j)) {//查找满足条件的
   j++;
  }
  if(j==n) {
   return i; //返回模式在文本中的开始位置
  }
  }
  return -1; 
 }
 public static void main(String[] args) {
  int pos=0;
  pos = bf_cmp("abcdefgh","fgh");
  if(pos != -1)
  System.out.print("T在S中第:"+pos+"个位置");
  else
  System.out.print("不匹配");  
 }
}

试试下面的看看

public static int bf_cmp(String S, String T) {
        int m=S.length();//T长
        int n=T.length();//S长
        int i,j;//记录主串下一次比较起始位置
        for(i=0; i<m; i++) {
            j=0;
            while(j<n && S.charAt(i)==T.charAt(j)) {//查找满足条件的
                j++;
                i++;
            }
            if(j==n) {
                return i-j; //返回模式在文本中的开始位置
            }
        }
        return -1;
    }

具体方法没有啥问题,就是你的for循环条件不对,漏掉了最后一次匹配,而你main方法中写的例子刚好又是最后一次才匹配成功,所有结果不对,你试试把你要查找的字符串不要放在被查找的字符串末尾再看看。所以,把for循环的条件改为i <= m-n 或者 i < m-n+1都可以
当然,其实你这么改了也还是不对,因为你在main方法中把S和T的位置写反了,根据方法的逻辑,明显是在T中找S出现的位置,你搞反了o(╯□╰)o