字符串匹配(java)实现,普通的匹配和KMP算法 (参考)

来源:互联网 发布:github 建站 打死 编辑:程序博客网 时间:2024/05/16 10:42

普通的字符串匹配:

public static int ViolentMatch(String str, String seed){  
        int i = 0;  
        int j = 0;  
        
        char[] strtochars = str.toCharArray();
        char[] seedtochars = seed.toCharArray();
                
        while (i < str.length() && j < seed.length())  
        {  
            if (strtochars[i] == seedtochars[j])  
            {  
                //①如果当前字符匹配成功(即S[i] == P[j]),则i++,j++      
                i++;  
                j++;  
            }  
            else  
            {  
                //②如果失配(即S[i]! = P[j]),令i = i - (j - 1),j = 0      
                i = i - j + 1;  
                j = 0;  
            }  
        }  
        //匹配成功,返回模式串p在文本串s中的位置,否则返回-1  
        if (j == seed.length())  
            return i - j;  
        else  
            return -1;  
    }


KMP算法实现的字符串匹配:

 public static int KmpSearch(String  s, String p){  
        int i = 0;
        int j = 0;
        char[] strtochars = s.toCharArray();
        char[] seedtochars = p.toCharArray();
        while (i < s.length() && j < p.length())
        {
            //①如果j = -1,或者当前字符匹配成功(即S[i] == P[j]),都令i++,j++      
            if (j == -1 || strtochars[i] == seedtochars[j])
            {
                i++;
                j++;
            }
            else
            {
                //②如果j != -1,且当前字符匹配失败(即S[i] != P[j]),则令 i 不变,j = next[j]      
                //next[j]即为j所对应的next值        
                j = next.get(j);
            }
        }
        if (j == p.length())
            return i - j;
        else
            return -1;
    }

  得到next数组:

 public static void GetNext(String p)  
    {  
        next.add(-1);
        int k = -1;
        int j = 0;
        char[] ps = p.toCharArray();
        while (j < p.length() - 1)  
        {
            //p[k]表示前缀,p[j]表示后缀  
            if (k == -1 || ps[j] == ps[k])   
            {
                ++k;  
                ++j;  
                next.add(k);  
            }
            else   
            {
                k = next.get(k);  
            }
        }
    }

得到nextvel数组:

  public static void GetNextval(String p)  
    {  
        next.add(-1);  
        int k = -1;  
        int j = 0;  
        char[] ps = p.toCharArray();
        while (j < p.length() - 1)  
        {  
            //p[k]表示前缀,p[j]表示后缀    
            if (k == -1 || ps[j] == ps[k])  
            {  
                ++j;  
                ++k;  
                //较之前next数组求法,改动在下面4行  
                if (ps[j] != ps[k])  
                    next.add(k);   //之前只有这一行  
                else  
                    //因为不能出现p[j] = p[ next[j ]],所以当出现时需要继续递归,k = next[k] = next[next[k]]  
                next.set(j, next.get(k));
            }  
            else  
            {  
                k = next.get(k);  
            }  
        }  
    }


0 0
原创粉丝点击