模式匹配——Sunday算法

Posted 小丫头い

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模式匹配——Sunday算法相关的知识,希望对你有一定的参考价值。

  • 今天看到一个新的模式串匹配算法,比我在课堂上学的那个KMP简单多了,而且很好理解啊,就是写的时候要特别注意索引的变化,千万不能写错哟!
public class Solution 
    public int strStr(String haystack, String needle) 
        if(haystack==null||haystack.length()<needle.length())
            return -1;
        
        if(haystack.length()==0||needle.length()==0)
            return 0;
        
        int i = 0;
        int j = 0;
        while(i<haystack.length())
            if(haystack.charAt(i)==needle.charAt(j)) //先进行匹配,若匹配成功,则两指针向后移动
                i++;
                j++;
            else //我们把模式串在文本串上滑动
                int index = i+needle.length()-j; //匹配不成功,则获取当前文本串中对应于整个模式串的下一位
                int occure;
                if(index>=haystack.length())  //当然这里要判断一下下一位是否存在
                    return -1;
                else
                    occure = needle.lastIndexOf(haystack.charAt(index)); //然后再判断这个字符在模式串中的位置,一定要注意是lastIndexOf
                
                if(occure==-1)
                    i = index + 1;
                else
                    i = index -occure; //将整个模式串滑动至cooure正好与index元素对应
                
                j = 0; //此时模式串回到最前面
            
            if(j==needle.length()) //如果模式串已经匹配完,则返回匹配成功的初始位置
                return i-needle.length();
            
        
        return -1;
    
  • 重点是两个移动:若下一位不在模式串中,则i直接移动到Index的下一位,若下一位在模式串中的occure,则i移动到Index-occure的位置(保证index元素和模式串中occure元素对齐)。并且注意找occure时是反向找的,嗯,就酱紫。

以上是关于模式匹配——Sunday算法的主要内容,如果未能解决你的问题,请参考以下文章

Sunday算法模板

Sunday算法

字符串匹配之Sunday算法

模式匹配——Sunday算法

Sunday算法

Sunday算法