Dmytro
Dmytro

Reputation: 73

Knuth-Morris-Pratt algorithm confusion

I'm trying to implement KMP algorithm. My algorithm works correctly with the following example

But when Text is 12121 and pattern is the same as above, result just: 1. I don't know if this is the problem of the algorithm or of my implementation?

Other example:

My code is:

public class KMP {
    public static void main(String[] args) throws IOException{
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String text = reader.readLine();
        String pattern = reader.readLine();
        search(text,pattern);
    }
    private static void search(String text,String pattern)
    {
        int[] Pi = Pi(pattern);
        for (int i = 0,q=0; i <text.length()&&q<pattern.length() ; i++,q++) {
            while (q>=0 && pattern.charAt(q)!=text.charAt(i))
            {
                q=Pi[q];
            }
            if(q==pattern.length()-1) {
                System.out.println(i-pattern.length()+2);
                q=Pi[q];
            }

        }
    }

    private static int[] Pi(String p) {
        int[] Pi = new int[p.length()];
        Pi[0]=-1;
        int i=0;
        int j=-1;
        while (i<p.length()-1) {
            while (j>=0 && p.charAt(j)!=p.charAt(i))
            {
                j=Pi[j];
            }
            i++;
            j++;
            if(p.charAt(j)==p.charAt(i)) Pi[i]=Pi[j];
            else Pi[i]=j;
        }
        return Pi;
    }

}

Upvotes: 0

Views: 544

Answers (1)

beehuang
beehuang

Reputation: 369

Hope help you.

public int strStr(String source, String target) {

    if (source == null || target == null){
        return -1;
    }
    if (source.isEmpty() && !target.isEmpty()){
        return -1;
    }
    if (source.isEmpty() && target.isEmpty()){
        return 0;
    }
    if (target.isEmpty()){
        return 0;
    }

    int index = 0;
    int compare_index = 0;
    int compare_start_index = 0;
    int compare_same_length = 0;
    List<Integer> answers = new ArrayList<Integer>();

    while (true){
        if (compare_same_length ==0){
            compare_start_index = compare_index;
        }

        if (source.charAt(compare_index) == target.charAt(index)){
            compare_same_length++;
            index++;
        } else {
            if (compare_same_length >0){
                compare_index--;
            }
            compare_same_length = 0;
            index = 0;
        }

        compare_index++;
        if (compare_same_length == target.length()){
            answers.add(compare_start_index+1);
            compare_same_length=0;
            index=0;
        }

        if (compare_index == source.length()){
            //here are answers
            for (int i = 0; i < answers.size(); i++) {
                int value = answers.get(i);
            }
            return 1;
        }
    }
}

Upvotes: 0

Related Questions