1.题目
实现 strStr() 函数。
给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/implement-strstr
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
说明:
当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。
对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与 C 语言的 strstr() 以及 Java 的 indexOf() 定义相符。
示例:
输入:haystack = "hello", needle = "ll"
输出:2
输入:haystack = "aaaaa", needle = "bba"
输出:-1
输入:haystack = "", needle = ""
输出:0
2.想法
自己的想法就是暴力解决,但是自己写的暴力解决有的条件却不满足,因此测试中往往出错,我也把自己写的放在这里。
自己的想法就是,将两个string转换成字符数组,再进行遍历,这样查看当第一个字符相等的时候,看之后的字符是否相等,直到等于needle的长度,说明把needle遍历完了,这应该返回下标即可得到。
class Solution {
public int strStr(String haystack, String needle) {
if( needle==null||needle.length()==0)
{
return 0;
}
if(haystack == needle) return 0;
char[] chhay = haystack.toCharArray();
char[] chnee = needle.toCharArray();
int neeLen = needle.length();
int l = 0;
for( int i = 0 ; i < haystack.length();i++)
{
if(chhay[i]==chnee[0])
{
for(char c:chnee)
{
if(chhay[i]==c)
{
l++;
if(l==neeLen) return i;
}
else break;
}
}
}
return -1;
}
}
自己写的测试一直出现问题,就不再这个基础上往上加代码了,越写越有问题,因此改变思路。查看一下别人的暴力解决。
2.1 别人思路
看了别人的思路,类似于使用两个指针,分别指向两个字符串,一个while循环判断是否相等,相等就自加1,不等就跳出while,
再看是否到达needle的最后,到达最后,就应该返回了,没到最后,就应该从指针的下一个位置继续循环。
代码:
class Solution {
public int strStr(String haystack, String needle) {
if(needle.length() == 0) return 0;
int n1 = haystack.length();
int n2 = needle.length();
int i = 0 ;
int j = 0;
while(i<n1-n2+1)
{
while(j<n2&&haystack.charAt(i)== needle.charAt(j))
{
i++;
j++;
}
if(j==n2) return i-j;
else{
i = i-j+1;
j = 0;
}
}
return -1 ;
}
}
while(i<n1-n2+1)这里+1是 n1-n2长度 的话应该比n2要长一个,比如n1=6;n2=4,所以你i在循环n1的时候起码得对比6-4+1次,这样才把n1全部遍历一遍啊。
举例:n1:abcdef n2:cdef;这样 ,n1得到第三次才能遍历完n2;所以需要+1.
3.总结
自己的想法总是复杂许多,其实不用想的那么复杂就可以做出来,一看别人的思路自己就知道怎么写了,自己练习积累的太少了,这道题用的 也类似于双指针,官方给的答案中,使用了flag:
class Solution {
public int strStr(String haystack, String needle) {
int n = haystack.length(), m = needle.length();
for (int i = 0; i + m <= n; i++) {
boolean flag = true;
for (int j = 0; j < m; j++) {
if (haystack.charAt(i + j) != needle.charAt(j)) {
flag = false;
break;
}
}
if (flag) {
return i;
}
}
return -1;
}
}
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/implement-strstr/solution/shi-xian-strstr-by-leetcode-solution-ds6y/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
这段代码先放在这里,以后可以回顾的时候看,这里的思想 举个例子:
str1: abcdef
str2:cdef
循环从0开始,判断0+4的str1和str2是否相等,这样一直遍历str2;如果不相等,flag设置为false,那么就可以返回-1了,要是相等的话,就flag不变,返回str1的指针i就可,其中需要注意的是,第一个for循环i+m<=n的。
还有字符串中可以使用的方法有charAt和startWith等。
这道题答案中还给出了一种KMP解法,这个解法我大概看了一下,如果以后遇到仔细看一下。