zoukankan      html  css  js  c++  java
  • [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;
        }
    };
  • 相关阅读:
    CSRF小结
    代码注入小结
    文件上传漏洞小结
    解决Burpsuite_pro_v1.6破解版https证书导入问题
    Java HTTP 组件库选型看这篇就够了
    趣图:我正在演示一个功能,但没有达到预期效果
    阅读源码的利器——Intellij-IDEA-Replace-in-Path-使用技巧
    分享一些好用的 Chrome 插件!
    趣图:程序员发量的变化过程
    Spring循环依赖的三种方式
  • 原文地址:https://www.cnblogs.com/immjc/p/8543825.html
Copyright © 2011-2022 走看看