Notice
Recent Posts
Recent Comments
Link
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Tags
more
Archives
Today
Total
관리 메뉴

지극히 개인적인 개발블로그

탐색 본문

카테고리 없음

탐색

코드분쇄기 2019. 9. 6. 13:42

부르트 포스법은선형 검색을 확장한 알고리즘으로써 완전탐색으로도 불립니다. 탐색을 위해 그냥 다 때려박는 거죠.

 

package Chap08;
import java.util.Scanner;

public class IndexOfTester {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        System.out.printf("텍스트: ");
        String s1 = sc.next();

        System.out.printf("패턴: ");
        String s2 = sc.next();

        int idx1 = s1.indexOf(s2);
        int idx2 = s1.lastIndexOf(s2);

        if(idx1 == -1)
            System.out.println("텍스트 안에 패턴이 없습니다.");
        else{
            int len1 = 0;
            for(int i=0; i<idx1; i++)
                len1 += s1.substring(i, i+1).getBytes().length;
            len1 += s2.length();

            int len2 = 0;
            for(int i=0; i<idx2; i++)
                len2 += s1.substring(i, i+1).getBytes().length;
            len2 += s2.length();

            System.out.println("텍스트: "+s1);
            System.out.printf(String.format("패턴:%%%ds\n", len1), s2);
            System.out.println("텍스트: "+s1);
            System.out.printf(String.format("패턴:%%%ds\n", len2), s2);
        }
    }
}

indexOf메소드를 이용하여 구현했습니다.

 

 

 

KMP법은 다른 문자를 만나면 패턴을 1칸씩 옮긴 다음 다시 패턴의 처음부터 검사하는 브루트-포스법과는 다르게 중간 검사 결과를 효율적으로 사용하는 알고리즘입니다.

public class KMPmatch {
    static int KMPmatch(String txt, String pat) {
        int pt = 1;
        int pp = 0;
        int[] skip = new int[pat.length() + 1];

        skip[pt] = 0;
        while (pt != pat.length()) {
            if (pat.charAt(pt) == pat.charAt(pp))
                skip[++pt] = ++pp;
            else if (pp == 0)
                skip[++pt] = pp;
            else
                pp = skip[pp];
        }

        pt = pp = 0;
        while (pt != txt.length() && pp != pat.length()) {
            if (txt.charAt(pt) == pat.charAt(pp)) {
                pt++;
                pp++;
            } else if (pp == 0)
                pt++;
            else
                pp = skip[pp];
        }
        if(pp == pat.length())
            return pt - pp;
        return -1;
    }
}