Algorithm 我认为我写的代码是对的,但我的拉宾·卡普没有';好像不行

Algorithm 我认为我写的代码是对的,但我的拉宾·卡普没有';好像不行,algorithm,data-structures,hash,string-matching,rabin-karp,Algorithm,Data Structures,Hash,String Matching,Rabin Karp,我一直在尝试构建一个Rabin Karp,并且我理解了登录,下面的代码也是同样的结果。 gfg文章中的代码似乎是相同的,只是我使用了一个循环而不是两个循环,并且在哈希函数中做了一些更改 你能帮我解决这个问题吗 class Solution { boolean check(String p, String s, int st){ for(int i=0;i<p.length();i++) if(p.charAt(

我一直在尝试构建一个Rabin Karp,并且我理解了登录,下面的代码也是同样的结果。 gfg文章中的代码似乎是相同的,只是我使用了一个循环而不是两个循环,并且在哈希函数中做了一些更改

你能帮我解决这个问题吗

class Solution
    {
        boolean check(String p, String s, int st){
            for(int i=0;i<p.length();i++)
                if(p.charAt(i)!=s.charAt(i+st)) return false;
            return true;
        }
        ArrayList<Integer> search(String p, String s){
            ArrayList<Integer> res = new ArrayList<>();
            long ph = 0, sh = 0, mul = 1;
            int i=0, d=2, pl = p.length(), mod = 1000000007;
            for(i=0;i<=s.length();i++){
                if(i<pl){
                    ph = (ph*d + p.charAt(i))%mod;
                    sh = (sh*d + s.charAt(i))%mod;
                    mul = (mul*d)%mod;
                }else{
                    if(ph == sh){
                        if(check(p, s, i-pl)) res.add(i-pl+1);
                    }
                    if(i<s.length())
                        sh = ((sh*d)-(mul*s.charAt(i-pl))+s.charAt(i)+mod)%mod;
                }
            }
            if(res.size()==0) res.add(-1);
            
            return res;
        }
    }
类解决方案
{
布尔检查(字符串p、字符串s、整数st){
对于(int i=0;i
public class Main 
{
    // d is the number of characters in the input alphabet
    public final static int d = 256;
    
    /* pat -> pattern
        txt -> text
        q -> A prime number
    */
    static void search(String pat, String txt, int q)
    {
        int M = pat.length();
        int N = txt.length();
        int i, j;
        int p = 0; // hash value for pattern
        int t = 0; // hash value for txt
        int h = 1;
    
        // The value of h would be "pow(d, M-1)%q"
        for (i = 0; i < M-1; i++)
            h = (h*d)%q;
    
        // Calculate the hash value of pattern and first
        // window of text
        for (i = 0; i < M; i++)
        {
            p = (d*p + pat.charAt(i))%q;
            t = (d*t + txt.charAt(i))%q;
        }
    
        // Slide the pattern over text one by one
        for (i = 0; i <= N - M; i++)
        {
    
            // Check the hash values of current window of text
            // and pattern. If the hash values match then only
            // check for characters on by one
            if ( p == t )
            {
                /* Check for characters one by one */
                for (j = 0; j < M; j++)
                {
                    if (txt.charAt(i+j) != pat.charAt(j))
                        break;
                }
    
                // if p == t and pat[0...M-1] = txt[i, i+1, ...i+M-1]
                if (j == M)
                    System.out.println("Pattern found at index " + i);
            }
    
            // Calculate hash value for next window of text: Remove
            // leading digit, add trailing digit
            if ( i < N-M )
            {
                t = (d*(t - txt.charAt(i)*h) + txt.charAt(i+M))%q;
    
                // We might get negative value of t, converting it
                // to positive
                if (t < 0)
                t = (t + q);
            }
        }
    }
    
    /* Driver Code */
    public static void main(String[] args)
    {
        String txt = "GEEKS FOR GEEKS";
        String pat = "GEEK";
          
          // A prime number
        int q = 101; 
      
          // Function Call
        search(pat, txt, q);
    }
}

// This code is contributed by nuclode