{ "question_id": 28, "question_title": "实现 strStr()", "difficulty": "简单", "question_content": "

实现 strStr() 函数。

\n

给你两个字符串 haystackneedle ,请你在 haystack 字符串中找出 needle\n 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回  -1

\n

 

\n

说明:

\n

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

\n

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

\n

 

\n

示例 1:

\n
输入:haystack = \"hello\", needle = \"ll\"
输出:
2
\n

示例 2:

\n
输入:haystack = \"aaaaa\", needle = \"bba\"
输出:
-1
\n

示例 3:

\n
输入:haystack = \"\", needle = \"\"
输出:
0
\n

 

\n

提示:

\n", "topic_link": "https://bbs.csdn.net/topics/600470119", "cpp": "#include \nusing namespace std;\nclass Solution\n{\npublic:\n\tint strStr(string haystack, string needle)\n\t{\n\t\treturn haystack.find(needle);\n\t}\n};", "java": "class Solution {\n\tpublic int strStr(String haystack, String needle) {\n\t\tif (needle.length() < 1) {\n\t\t\treturn 0;\n\t\t}\n\t\tchar[] ha = haystack.toCharArray();\n\t\tchar[] ne = needle.toCharArray();\n\t\tint hi = 0;\n\t\tint ni = 0;\n\t\tint[] next = getNextArray(ne);\n\t\twhile (hi < ha.length && ni < ne.length) {\n\t\t\tif (ha[hi] == ne[ni]) {\n\t\t\t\thi++;\n\t\t\t\tni++;\n\t\t\t} else {\n\t\t\t\tif (next[ni] == -1) {\n\t\t\t\t\thi++;\n\t\t\t\t} else {\n\t\t\t\t\tni = next[ni];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn ni == ne.length ? hi - ni : -1;\n\t}\n\tpublic static int[] getNextArray(char[] a) {\n\t\tif (a.length == 1) {\n\t\t\treturn new int[] { -1 };\n\t\t}\n\t\tint[] next = new int[a.length];\n\t\tnext[0] = -1;\n\t\tnext[1] = 0;\n\t\tint i = 2;\n\t\tint j = 0;\n\t\twhile (i < next.length) {\n\t\t\tif (a[i - 1] == a[j]) {\n\t\t\t\tnext[i++] = ++j;\n\t\t\t} else if (j > 0) {\n\t\t\t\tj = next[j];\n\t\t\t} else {\n\t\t\t\tnext[i++] = 0;\n\t\t\t}\n\t\t}\n\t\treturn next;\n\t}\n}", "js": "", "python": "class Solution(object):\n\tdef strStr(self, haystack, needle):\n\t\tlsh, lsn = len(haystack), len(needle)\n\t\tif lsn == 0:\n\t\t\treturn 0\n\t\tnext = self.makeNext(needle)\n\t\ti = j = 0\n\t\twhile i < lsh:\n\t\t\tif j == -1 or haystack[i] == needle[j]:\n\t\t\t\ti += 1\n\t\t\t\tj += 1\n\t\t\t\tif j == lsn:\n\t\t\t\t\treturn i - lsn\n\t\t\tif i < lsh and haystack[i] != needle[j]:\n\t\t\t\tj = next[j]\n\t\treturn -1\n\tdef makeNext(self, needle):\n\t\tls = len(needle)\n\t\tnext = [0] * ls\n\t\tnext[0], i, j = -1, 0, -1\n\t\twhile i < ls - 1:\n\t\t\tif j == -1 or needle[i] == needle[j]:\n\t\t\t\tnext[i + 1] = j + 1\n\t\t\t\tif needle[i + 1] == needle[j + 1]:\n\t\t\t\t\tnext[i + 1] = next[j + 1]\n\t\t\t\ti += 1\n\t\t\t\tj += 1\n\t\t\tif needle[i] != needle[j]:\n\t\t\t\tj = next[j]\n\t\treturn next\n# %%\ns = Solution()\nprint(s.strStr(haystack = \"hello\", needle = \"ll\"))", "status": 0, "keywords": "双指针,字符串,字符串匹配", "license": { "cpp": "https://github.com/begeekmyfriend/leetcode", "python": "https://github.com/qiyuangong/leetcode", "java": "https://blog.csdn.net/weixin_43780574/article/details/84397763" }, "notebook": { "cpp": "https://codechina.csdn.net/csdn/csdn-daily-code/-/jupyter/master/data/notebook/leetcode/ipynb/27/27_cpp.ipynb?type=file", "python": "https://codechina.csdn.net/csdn/csdn-daily-code/-/jupyter/master/data/notebook/leetcode/ipynb/27/27_python.ipynb?type=file", "java": "https://codechina.csdn.net/csdn/csdn-daily-code/-/jupyter/master/data/notebook/leetcode/ipynb/27/27_java.ipynb?type=file" }, "notebook_enable": 1 }