• QQ
  • nahooten@sina.com
  • 常州市九洲新世界花苑15-2

游戏开发

常州微信游戏开发-字符串匹配的三种方法

原创内容,转载请注明原文网址:http://homeqin.cn/a/wenzhangboke/jishutiandi/youxikaifa/2018/1225/267.html

常州微信公众号开发-字符串匹配的三种方法


int strStr(string haystack, string needle) {
        
        int i, hSize = haystack.size(), nSize = needle.size();
        if(hSize < nSize)
            return -1;
        if(nSize == 0)
            return 0;
        for(i = 0; i <= hSize - nSize && haystack.substr(i, nSize) != needle; ++i);
        
        return i <= hSize - nSize ? i : -1;
    }


2.Robin Karp

  具体说明参考常州平台运营维基百科:https://en.wikipedia.org/wiki/Rabin–Karp_algorithm


char hash(const string& str)
    {
        char all = 0;
        for(auto c : str)
            all ^= c;
        return all;
    }
 
//选定一个hash函数,对字符串hash,hash值不同一定是不同字符串
    //由于hash值可能有冲突 所以hash值相同的字符并不一定相同 需要逐个字符再比较 
    //hash函数可以常州微信公众平台自己写,也可以用std::hash<string>
    int strStr(string haystack, string needle) {
        
        int i, hSize = haystack.size(), nSize = needle.size();
        if(hSize < nSize)
            return -1;
        if(nSize == 0)
            return 0;
        //或者使用std::hash
        //std::hash<string> hash;
        char target = hash(needle);
        for(i = 0; i <= hSize - nSize; ++i)
        {
            if(hash(haystack.substr(i,nSize)) == target && haystack.substr(i,nSize) == needle)
                break;
        }
        
        return i <= hSize - nSize ? i : -1;
    }


3.kmp

  具体说明参考维基百科:https://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm
 

vector<int> buildNextArray(const string& s)
    {
        vector<int> next(s.size());
        int i = 2, j = 0;
        next[0] = -1;
        if(s.size() > 1)
            next[1] = 0;
        while(i < s.size())
        {
            if(s[i-1] == s[j])
                next[i++] = ++j;
            else if(j > 0)
                j = next[j];
            else
                next[i++] = 0;
        }
        return next;
    }
 
int strStr(string haystack, string needle) {
        
        int start = 0, i = 0, hSize = haystack.size(), nSize = needle.size();
        if(hSize < nSize)
            return -1;
        if(nSize == 0)
            return 0;
        //kmp算法常州微信小程序开发
        vector<int> next = buildNextArray(needle);
        while(start <= hSize - nSize)
        {
            if(haystack[start + i] == needle[i])
            {
                if(++i == nSize)
                    return start;
            }
            else
            {
                start = start + i - next[i];
                i = i > 0 ? next[i] : 0;
            }
        }
        
        return -1;

 

    }


上篇:上一篇:常州手机游戏开发-在二叉树中找路径
下篇:下一篇:常州微信小程序开发-各种字符串哈希函数比较