LeetCode28:Implement strStr()

Implement strStr().

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

Example 1:

Input: haystack = "hello", needle = "ll"
Output: 2

Example 2:

Input: haystack = "aaaaa", needle = "bba"
Output: -1

Clarification:

What should we return when needle is an empty string? This is a great question to ask during an interview.

For the purpose of this problem, we will return 0 when needle is an empty string. This is consistent to C's strstr() and Java's indexOf().


LeetCode:链接

参考链接:点这里   点这里呀

这题就是最长公共字符串匹配。

第一种方法:暴力匹配法

即从haystack开始第一个字符与needle第一个字符匹配,如果匹配,则i++,j++,继续往下走,否则中间一旦发生不匹配,则haystack则从第二个字符开始于needle第一个字符重新开始匹配。重复这个过程,如果中间j走到needle结尾,则匹配成功,如果i走到了haystack结尾处,而j还没有,则匹配失败。

必须得有needle长度那么大才可以判断,不能for i in range(n),会超时。

class Solution(object):
    def strStr(self, haystack, needle):
        """
        :type haystack: str
        :type needle: str
        :rtype: int
        """
        if not needle:
            return 0
        n = len(haystack)
        m = len(needle)
        '''必须得有needle长度那么大才可以判断 不能for i in range(n) 会超时'''
        for i in range(n-m+1):
            j = 0
            '''在needle范围内判断'''
            while j < m:
                '''只要有不相等 直接退出循环'''
                if haystack[i+j] != needle[j]:
                    break
                j += 1
            '''如果此时的j和needle的长度相等 说明匹配到了'''
            if j == m:
                return i 
        return -1

第二种方法:KMP。

class Solution(object):
    def get_partital_table(self, needle):
        m = len(needle)
        partital_table = [0] * m
        i, j = 1, 0
        while i < m:
            if needle[i] == needle[j]:
                partital_table[i] = j + 1
                i += 1
                j += 1
            else:
                if j > 0:
                    j = partital_table[j-1]
                else:
                    partital_table[i] = 0
                    i += 1
        return partital_table

    def strStr(self, haystack, needle):
        """
        :type haystack: str
        :type needle: str
        :rtype: int
        """
        if not needle:
            return 0
        n, m = len(haystack), len(needle)
        partital_table = self.get_partital_table(needle)
        i, j = 0, 0
        while i < n:
            if haystack[i] == needle[j]:
                i += 1
                j += 1
            else:
                if j > 0:
                    j = partital_table[j-1]
                else:
                    i += 1
            if j == m:
                return i - m
        return -1

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值