风雨雾凇 风雨雾凇
首页
  • 服务端

    • golang
  • 其他

    • leetcode
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

风雨雾凇

技术小渣渣
首页
  • 服务端

    • golang
  • 其他

    • leetcode
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • golang

  • 技术文档

  • GitHub技巧

  • Nodejs

  • 博客搭建

  • leetcode

    • 两数之和-1
    • 无重复字符的最长子串-3
    • 整数翻转-7
    • 回文数-9
    • 13-罗马数字转整数
    • 最长公共前缀
    • 3Sum
    • Valid Parentheses
    • Merge Two Sorted Lists
    • Remove Duplicates from Sorted Array
    • Remove Element
    • Implement strStr()
      • Search Insert Position
      • Count and Say
      • 字符串相乘
      • Maximum Subarray
      • Length of Last Word
      • Plus One
      • Add Binary
      • Sqrt(x)
      • 翻转字符串里的单词
      • 字符串的排列
    • 机器学习

    • 技术
    • leetcode
    风雨雾凇
    2020-02-08
    目录

    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)
    链接:https://leetcode-cn.com/problems/implement-strstr
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21

    # 解答思路

    双循环暴力解法。

    kmp解法:相较于暴力解法更聪明,遇到特定字符时不会完全从头开始,而是遵从pat生成的next数组规则(即确认有限自动状态机)。如下图所示:

    kmp解法图例

    主要任务在于构建确认有限自动状态机,即上图中的跳转规则。创建next数组如下图所示:

    next数组

    伪代码:

    public class KMP {
        private int[][] dp;
        private String pat;
    
        public KMP(String pat) {
            this.pat = pat;
            int M = pat.length();
            // dp[状态][字符] = 下个状态
            dp = new int[M][256];
            // base case
            dp[0][pat.charAt(0)] = 1;
            // 影子状态 X 初始为 0
            int X = 0;
            // 构建状态转移图(稍改的更紧凑了)
            for (int j = 1; j < M; j++) {
                for (int c = 0; c < 256; c++) {
                    // 等于重置状态 x 值
                    dp[j][c] = dp[X][c];
                }
                // 步进状态
                dp[j][pat.charAt(j)] = j + 1;
                // 更新影子状态 等于为 dp[j][c] = dp[X][c]; 做下一步的映射准备
                X = dp[X][pat.charAt(j)];
            }
        }
    
        public int search(String txt) {
            int M = pat.length();
            int N = txt.length();
            // pat 的初始态为 0
            int j = 0;
            for (int i = 0; i < N; i++) {
                // 计算 pat 的下一个状态
                j = dp[j][txt.charAt(i)];
                // 到达终止态,返回结果
                if (j == M) return i - M + 1;
            }
            // 没到达终止态,匹配失败
            return -1;
        }
    }
    
    /**
    作者:labuladong
    链接:https://leetcode-cn.com/problems/implement-strstr/solution/kmp-suan-fa-xiang-jie-by-labuladong/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    /
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48

    # 代码

    package easy
    
    import "testing"
    
    /**
    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)
    链接:https://leetcode-cn.com/problems/implement-strstr
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
    */
    // 暴力解
    func strStr(haystack string, needle string) int {
    	// 健壮性编写
    	if len(needle) == 0 {
    		return 0
    	}
    	if len(needle) > len(haystack) {
    		return -1
    	}
    	var i, j int
    	for i = 0; i < len(haystack); i++ {
    		for j = 0; j < len(needle); j++ {
    			if haystack[i+j] != needle[j] {
    				break
    			}
    		}
    		if j == len(needle) {
    			return i
    		}
    		// 剩余字符串长度小于needle长度则返回
    		if len(haystack)-i-1 < len(needle) {
    			return -1
    		}
    	}
    	return -1
    }
    
    func TestStrStr(t *testing.T) {
    	println(strStr("hello", "ll"))
    	println(strStr("aaaaa", "bba"))
    	println(strStr("aaaaa", "aa"))
    	println(strStr("mississippi", "issipi"))
    }
    
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    编辑 (opens new window)
    #面试#学习笔记#leetcode
    上次更新: 2023/02/17, 16:53:03
    Remove Element
    Search Insert Position

    ← Remove Element Search Insert Position→

    最近更新
    01
    builtin
    02-12
    02
    导读
    02-12
    03
    13-罗马数字转整数
    01-30
    更多文章>
    Theme by Vdoing | Copyright © 2017-2023 风雨雾凇 | 粤ICP备16018321号-2
    博客内容遵循署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式