28. Implement strStr()

原创 2016年08月30日 10:15:41

Implement strStr().

Returns the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack

实现strStr()函数:返回模式P在文本T中的索引,如果没有发现则返回-1。


Brute Force:(暴力求解法)

int strStr(char* haystack, char* needle) {
    int h_index=0;
    int n_index=0;
    if(*haystack=='\0'&&*needle=='\0') 
       h_index=0;
       else if(*haystack=='\0'&&*needle!='\0')
       h_index=-1;
    while(*haystack!='\0')           //判断haystack字符数组是否结束
    {
        while(*needle!='\0')         //判断needle字符数组是否结束
        {
            if(*haystack!=*needle)
            {
                haystack-=n_index;   //h指针回位
                needle-=n_index;     //n指针回位
                n_index=0;
                break;               //有一个字符不相等
            }
            else
            {
                haystack++;
                needle++;
                n_index++;
            }
        }
        if(*needle=='\0')           //确定是子字符串
            break;
        else                        //比较下一个
        {
            haystack++;
            h_index++; 
            if(*haystack=='\0')
            {
                h_index=-1;
                break;
            }
        }
    }
    return h_index;
}
思路很简单,匹配失败则移动一个字符继续匹配,最坏复杂度为O(n^2),在LeetCode OJ上提交时由于Time limit exceeded失败。


Sunday 算法

int strStr(char* haystack, char* needle) {
    int h_index,n_index,m,n=0;
    n=strlen(haystack);
    m=strlen(needle);
    if(*haystack=='\0'&&*needle=='\0')
    h_index=0;
    else if(*haystack=='\0'&&*needle!='\0'||n<m)
    h_index=-1;
    else
    {
        for(h_index=0;h_index<(n-m+1);)
        {
            for(n_index=0;n_index<m;n_index++)        //P与T逐一对比
            {
                if(*(haystack+h_index+n_index)!=*(needle+n_index))
                break;
            }
            if(n_index<m&&h_index==(n-m))            //最后一次匹配失败
            {
                h_index=-1;
                break;
            }
            if(n_index<m)                          //非最后一次匹配失败
            {
                h_index+=m;                            //T的下标移动至haystack+m处
                for(n_index=m-1;n_index>-1;n_index--)  //从右往左将P与haystack+m处字符比较
                {
                    if(*(haystack+h_index)==*(needle+n_index))
                    break;
                }
                if(n_index==-1&&(n-h_index+1)>m)             //匹配不上且容得下P,从haystack+m+1处开始比较
                h_index++;
                else if(n_index>-1&&(n-h_index)>=(m-n_index)) //匹配上且T能容下移动过的P,将P移至匹配字符处
                h_index-=n_index;
                else                                         //否则结束
                {
                    h_index=-1;
                    break;
                }
            }
            else                                        //直接匹配成功
            break;
        }
    }
    return h_index;
}
其核心思想是:在匹配过程中,模式串发现不匹配时,算法能跳过尽可能多的字符以进行下一步的匹配,从而提高了匹配效率。

提交结果如下


还有其他诸如KMP算法,但实现比较复杂我没有搞懂。



版权声明:本文为博主原创文章,转载请声明出处:)

【LeetCode-面试算法经典-Java实现】【028-Implement strStr() (实现strStr()函数)】

[【028-Implement strStr() (实现strStr()函数)】](028-Implement strStr() (实现strStr()函数))【LeetCode-面试算法经典-Jav...
  • DERRANTCM
  • DERRANTCM
  • 2015年07月25日 08:08
  • 2609

[C++]Implement strStr() 找到子字符串第一次出现的位置

leetcode 原题链接:https://leetcode.com/problems/implement-strstr/ Implement strStr(). Returns th...
  • lyy_hit
  • lyy_hit
  • 2015年08月23日 20:14
  • 1199

Stack_Queue 一个数组实现三个栈 @CareerCup

原文: Describe how you could use a single array to implement three stacks. 译文: 你如何只用一个数组实现三个栈...
  • hellobinfeng
  • hellobinfeng
  • 2014年03月01日 11:35
  • 1733

LeetCode 28 — Implement strStr()(C++ Java Python)

题目: 题目翻译: 分析: C++实现: Java实现: Python实现: 感谢阅读,欢迎评论!...
  • dragon_dream
  • dragon_dream
  • 2014年04月14日 09:26
  • 3186

LeetCode 28_Implement strStr()

这是今天的第三题了,也是leetcode第28题,算法的难度也是easy,但字符串匹配这个问题本身是一个非常重要的问题。而其算法有相对简单的,有比较难的,今天我们来讲一个比较有深度的方法。当然,算法难...
  • cyfcsd
  • cyfcsd
  • 2015年11月25日 19:48
  • 413

Leetcode 28. Implement strStr()

Implement strStr().Returns the index of the first occurrence of needle in haystack, or -1 if needle ...
  • liudaxia1990
  • liudaxia1990
  • 2016年06月13日 18:13
  • 158

[LeetCode] 28. Implement strStr()

[LeetCode] 28. Implement strStr()Implement strStr().Returns the index of the first occurrence of nee...
  • ouwenjie10
  • ouwenjie10
  • 2017年02月21日 23:16
  • 97

[LeetCode-28] Implement strStr(KMP 字符串匹配)

1、KMP算法的思想 由D.E.Knuth、J.H.Morris和V.R.Pratt共同提出了一个改进算法,消除了Brute-Force算法中串s指针的回溯,完成串的模式匹配。时间复杂度为O(s.c...
  • xy010902100449
  • xy010902100449
  • 2015年11月20日 17:59
  • 913

leetcode:28. Implement strStr()

Implement strStr().Returns the index of the first occurrence of needle in haystack, or -1 if needle ...
  • Earl211
  • Earl211
  • 2017年03月13日 09:03
  • 195

LeetCode 28 Implement strStr() (C,C++,Java,Python)

Problem: Implement strStr(). Returns the index of the first occurrence of needle in haystack...
  • runningtortoises
  • runningtortoises
  • 2015年05月12日 11:59
  • 1461
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:28. Implement strStr()
举报原因:
原因补充:

(最多只允许输入30个字)