• lintcode-13-字符串查找


    字符串查找

    对于一个给定的 source 字符串和一个 target 字符串,你应该在 source 字符串中找出 target 字符串出现的第一个位置(从0开始)。如果不存在,则返回 -1。

    说明

    在面试中我是否需要实现KMP算法?
    不需要,当这种问题出现在面试中时,面试官很可能只是想要测试一下你的基础应用能力。当然你需要先跟面试官确认清楚要怎么实现这个题。

    样例

    如果 source = "source" 和 target = "target",返回 -1。
    如果 source = "abcdabcdefg" 和 target = "bcd",返回 1。

    挑战

    O(n2)的算法是可以接受的。如果你能用O(n)的算法做出来那更加好。(提示:KMP)

    标签

    基本实现 字符串处理 脸书

    方法一,暴力破解

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

    方法二:KMP算法

    class Solution {
    public:
        /**
         * Returns a index to the first occurrence of target in source,
         * or -1  if target is not part of source.
         * @param source string to be scanned.
         * @param target string containing the sequence of characters to match.
         */
        int strStr(const char *source, const char *target) {
            // write your code here
            if(source == NULL || target == NULL)
                return -1;
            if(source[0] == '' && target[0] == '')
                return 0;
            if(target[0] == '')
                return 0;
    
            int sourceLen = strlen(source), targetLen = strlen(target);
            int *next = getNext(target, targetLen);
    
            int i=0, j=0;
            for (i=0; i<sourceLen; i++) {
                while (j > 0 && source[i] != target[j])  
                    j = next[j];
                
                if (source[i] == target[j])  
                    j++;
    
                if (j == targetLen) {
                    return i-j+1;
                    j = next[j];
                }  
            }
            return -1;  
        }
    
        int *getNext(const char *target, int targetLen) {
            int *next = new int[targetLen+1];
            int i=0, j=0;
    
            next[0] = next[1] = 0; 
              
            for(i=1; i<targetLen; i++) {
                while(j>0 && target[i]!=target[j])
                    j = next[j];
                if(target[i] ==target[j])
                    j++;  
                next[i+1] = j;  
            }  
              
            return next;  
        }
    };
    
  • 相关阅读:
    使用Azure CLI实现自动关闭Azure虚拟机的脚本
    Azure自动化部署服务 (1)
    证书相关知识
    Azure上七层负载均衡APP Gateway
    简谈 Java 中的泛型通配符
    表单提交后为什么要重定向?
    eclipse 误删文件的恢复,代码的恢复
    书籍列表
    Mybatis Generator最完整配置详解
    学习spring mvc
  • 原文地址:https://www.cnblogs.com/libaoquan/p/6980182.html
Copyright © 2020-2023  润新知