模式匹配——Sunday算法

来源:互联网 发布:手机验钞机软件 编辑:程序博客网 时间:2024/06/04 19:23
  • 今天看到一个新的模式串匹配算法,比我在课堂上学的那个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时是反向找的,嗯,就酱紫。
0 0
原创粉丝点击