• leetcode28:实现strStr()


    实现 strStr() 函数。

    给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回  -1。

    示例 1:

    输入: haystack = "hello", needle = "ll"
    输出: 2
    示例 2:

    输入: haystack = "aaaaa", needle = "bba"
    输出: -1
    说明:

    当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。

    对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与C语言的 strstr() 以及 Java的 indexOf() 定义相符。

    Sunday匹配==》核心思想是:在匹配过程中,模式串发现不匹配时,算法能跳过尽可能多的字符以进行下一步的匹配,从而提高了匹配效率。

    • 对齐目标串和模式串,从前向后匹配
    • 关注主串中位于模式串后面的第一个元素(核心)
    • 如果关注的字符没有在子串中出现则直接跳过
    • 否则开始移动模式串,移动位数 = 子串长度 - 该字符最右出现的位置(以0开始)==>移到下一个元素和模式串中最后一个该字符对齐

    =============================================Python============================================

    class Solution:
        def strStr(self, haystack: str, needle: str) -> int:
            def findPos(a, arr):
                for i in range(len(arr)):
                    if arr[len(arr)-i-1] == a:
                        return len(arr) - i - 1
                return -1
            
            if not needle:
                return 0
            if not haystack:
                return -1
            if len(haystack) < len(needle):
                return -1
            
            l = len(needle)
            i = 0
            j = 0
            while j < len(needle):
                if i > len(haystack) - 1:
                    return -1
                if needle[j] == haystack[i]:
                    i += 1
                    j += 1
                else:
                    nextInd = len(needle) - j + i
                    if nextInd < len(haystack):
                        tmp = findPos(haystack[nextInd], needle)
                        if tmp == -1:
                            i = nextInd + 1
                        else:
                            i = nextInd - tmp
    // i += len(needle) - j - tmp j
    = 0 else: return - 1 return i - j

    ============================================Java=================================

    class Solution {
        public int strStr(String haystack, String needle) {
            if (haystack == null || needle == null) {
                return 0;
            }
            if (haystack.length() < needle.length()) {
                return -1;
            }
            //目标串匹配索引
            int originIndex = 0;
            //模式串匹配索引
            int aimIndex = 0;
            //成功匹配完终止条件:所有aim均成功匹配
            while (aimIndex < needle.length()) {
                //针对origin匹配完,但aim未匹配完情况处理
                if (originIndex > haystack.length() - 1) {
                    return -1;
                }
                if (haystack.charAt(originIndex) == needle.charAt(aimIndex)) {
                    //匹配index均加1
                    originIndex++;
                    aimIndex++;
                } else {
                    int nextCharIndex = originIndex - aimIndex + needle.length();
                    //判断下一个目标字符是否存在
                    if (nextCharIndex < haystack.length()){
                        //判断目标字符在模式串中匹配到,返回最后一个匹配的index
                        int step = needle.lastIndexOf(haystack.charAt(nextCharIndex));
                        if (step == -1) {
                            //不存在的话,设置到目标字符的下一个元素
                            originIndex = nextCharIndex + 1;
                        } else {
                            originIndex = nextCharIndex - step;
                        }
                        //模式串总是从第一个开始匹配
                        aimIndex = 0;
                    } else {
                        return -1;
                    }
                }
            }
            return originIndex - aimIndex;
        }
    }

    双指针

    class Solution:
        def strStr(self, haystack: str, needle: str) -> int:
            if needle is '':
                return 0
            if len(needle) > len(haystack):
                return -1
            i = 0
            while i < len(haystack) - len(needle) + 1:
                j = 0
                while j < len(needle) and needle[j] == haystack[i + j]:
                    if j == len(needle) - 1:
                        return i
                    j += 1
                i += 1
            return -1

    RollingHash

  • 相关阅读:
    Android获取实时连接热点的设备IP地址
    CentOS7打开关闭防火墙与端口
    Nginx的反向代理和负载均衡
    Linux系统(centos7)中Nginx安装、配置和开机自启
    navicat for oracle 创建表ID字段的自动递增
    Java初学者的学习路线建议
    分享一些JAVA常用的学习网站
    ThinkPHP框架
    PHP中的session
    PHP中的Cookie
  • 原文地址:https://www.cnblogs.com/liushoudong/p/13512840.html
Copyright © 2020-2023  润新知