首页 文章

修改Boyer Moore以进行多种模式搜索

提问于
浏览
2

我根据site使用了Boyer Moore算法 . 这仅在文本中实现模式搜索一次,程序退出 . 有人可以帮我修改这段代码,以便用它们的起始和结束索引多次找到该模式吗?

public class BoyerMoore {
        private final int R;     // the radix
        private int[] right;     // the bad-character skip array
        private String pat;      // or as a string

        // pattern provided as a string
        public BoyerMoore(String pat) {
            this.R = 256;
            this.pat = pat;

            // position of rightmost occurrence of c in the pattern
            right = new int[R];
            for (int c = 0; c < R; c++)
                right[c] = -1;
            for (int j = 0; j < pat.length(); j++)
                right[pat.charAt(j)] = j;
        }

        // return offset of first match; N if no match
        public ArrayList<Integer> search(String txt) {
            int M = pat.length();
            int N = txt.length();
            ArrayList<Integer> newArrayInt = new ArrayList<Integer>();
            int skip;
            for (int i = 0; i <= N - M; i += skip) {
                skip = 0;
                for (int j = M-1; j >= 0; j--) {
                    if (pat.charAt(j) != txt.charAt(i+j)) {
                        skip = Math.max(1, j - right[txt.charAt(i+j)]);
                        break;
                    }
                }
                if (skip == 0) 
                    newArrayInt.add(i);    // found
            }
            return newArrayInt;                       // not found
        }

        // test client
        public static void main(String[] args) {
            String pat = "abc";
            String txt = "asdf ghjk klll abc qwerty abc and poaslf abc";

            BoyerMoore boyermoore1 = new BoyerMoore(pat);

            ArrayList<Integer> offset = boyermoore1.search(txt);

            // print results
            System.out.println("Offset: "+ offset);


 }
}

2 回答

  • 0

    我知道了 . 当它在文本中找到模式时,跳过始终为0 .

    public class BoyerMoore {
        private final int R;     // the radix
        private int[] right;     // the bad-character skip array
        private String pat;      // or as a string
    
        // pattern provided as a string
        public BoyerMoore(String pat) {
            this.R = 256;
            this.pat = pat;
    
            // position of rightmost occurrence of c in the pattern
            right = new int[R];
            for (int c = 0; c < R; c++)
                right[c] = -1;
            for (int j = 0; j < pat.length(); j++)
                right[pat.charAt(j)] = j;
        }
    
        // return offset of first match; N if no match
        public ArrayList<Integer> search(String txt) {
            int M = pat.length();
            int N = txt.length();
            ArrayList<Integer> newArrayInt = new ArrayList<Integer>();
            int skip;
            for (int i = 0; i <= N - M; i += skip) {
                skip = 0;
                for (int j = M-1; j >= 0; j--) {
                    if (pat.charAt(j) != txt.charAt(i+j)) {
                        skip = Math.max(1, j - right[txt.charAt(i+j)]);
                        break;
                    }
                }
                if (skip == 0) 
                {
                    newArrayInt.add(i);    // found
                    skip++;
                }
            }
            return newArrayInt;                       // not found
        }
    
        // test client
        public static void main(String[] args) {
            String pat = "abc";
            String txt = "asdf ghjk klll abc qwerty abc and poaslf abc";
    
            BoyerMoore boyermoore1 = new BoyerMoore(pat);
    
            ArrayList<Integer> offset = boyermoore1.search(txt);
    
            // print results
            System.out.println("Offset: "+ offset);
        }
    }
    
  • 5
    public class Boyer {
        /**
         * @param args
         */
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            Scanner get= new Scanner(System.in);
          String m,n;
          int i,j;
          String T,P;
          T=get.nextLine();
          System.out.println("Text T is"+T);
          P=get.nextLine();
          System.out.println("Pattern P is"+P);
          int n1=T.length();
          int m1=P.length();
          for(i=0;i<=n1-m1;i++){
               j=0;
              while(j<m1 && (T.charAt(i+j)==P.charAt(j))){
                   j=j+1;
                   if(j==m1)
                       System.out.println("match found at"+i);
              }
          }
        }
    }
    

相关问题