20210509力扣第28题实现strStr()

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解法,这个解法我大概看了一下,如果以后遇到仔细看一下。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值