• [LintCode] 字符串问题


    1、字符串包含问题

    1)串的模式匹配算法

    (LintCode:字符串查找)

    BF

    class Solution {
    public:
        /*
         * @param source: source string to be scanned.
         * @param target: target string containing the sequence of characters to match
         * @return: a index to the first occurrence of target in source, or -1  if target is not part of source.
         */
        int strStr(const char *source, const char *target) {
            // write your code here
            if (source == NULL || target == NULL)
                return -1;
            int slen = strlen(source);
            int tlen = strlen(target);
            if (tlen == 0)
                return 0;
            if (slen == 0)
                return -1;
            for (int i = 0; i < slen; ++i)
            {
                for (int j = 0, s = i; j < tlen && s < slen; ++j, ++s)
                {
                    if (source[s] != target[j])
                    {
                        break;
                    }
                    else
                    {
                        if (j == tlen - 1)
                            return i;
                    }
                    
                }
            }
            return -1;
        }
    };

    KMP

    class Solution {
    public:
        /*
         * @param source: source string to be scanned.
         * @param target: target string containing the sequence of characters to match
         * @return: a index to the first occurrence of target in source, or -1  if target is not part of source.
         */
        int strStr(const char *source, const char *target) {
            // write your code here
            if (source == NULL || target == NULL)
                return -1;
            int slen = strlen(source);
            int tlen = strlen(target);
            if (tlen == 0)
                return 0;
            if (slen == 0)
                return -1;
            return kmp(source, target);
        }
        
        int kmp(const char *source, const char *target)
        {
            int *next = getNext(target);
            int slen = strlen(source);
            int tlen = strlen(target);
            int i = 0, j = 0, res = -1;
            while (i < slen)
            {
                if (j == -1 || source[i] == target[j])
                {
                    ++i;
                    ++j;
                }
                else
                {
                    j = next[j];
                }
                if (j == tlen)
                {
                    res = i - tlen;
                    break;
                }
            }
            delete[] next;
            return res;
        }
        
        int* getNext(const char *target)
        {
            int tlen = strlen(target);
            int *next = new int[tlen];
            int i = 0, j = -1;
            next[0] = -1;
            while (i < tlen - 1)
            {
                if (j == -1 || target[i] == target[j])
                {
                    ++i;
                    ++j;
                    next[i] = j;
                }
                else
                {
                    j = next[j];
                }
            }
            return next;
        }
    };
  • 相关阅读:
    阿牛的EOF牛肉串
    盐水的故事
    密码
    Digital Roots
    不容易系列之(3)—— LELE的RPG难题
    不容易系列之一
    超级楼梯
    母牛的故事
    蟠桃记
    Children’s Queue
  • 原文地址:https://www.cnblogs.com/immjc/p/8543825.html
Copyright © 2020-2023  润新知