力扣:28. 实现 strStr()

实现 strStr() 函数。

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

 这道题思路不难,我用了两种做法:

1,利用String里面的substring()函数来依次截取,然后判断字符串是否相等。由于思路简单,这里不做赘述,看代码:

class Solution {
    public int strStr(String haystack, String needle) {

        int len1 = haystack.length() , len2 = needle.length() ;
        if(len1 < len2 )
         return -1 ;    
     
         for( i = 0 ; i < len1  ; i= i + 1){
             if(   i + len2 <= len1){
                //截取字符串然后比较
                  String newS = haystack.substring( i , len2+i) ; 
                  System.out.println(newS) ; 
                  if(needle.equals(newS)) //调用equals()函数
                     return i ;
             }
         }
        return -1 ;
    }
}

执行效果如下:

看到此处的时间效率太高,我也不想总自带的函数来实现。看是否能手动写出来一个实现该问题的方法,于是我尝试着写了一个,发现在测试用例较少的情况下比第一个方法要好。

2,采用双层for循环,来暴力判断字符串是否相等: 

class Solution {
    public int strStr(String haystack, String needle) {

        int i , j = 0 ,k = 0 ; 
        int len1 = haystack.length() , len2 = needle.length() ;
        boolean flag = true ;
        if(len1 < len2 )
         return -1 ;    
       
        for( i = 0 ; i < len1   ; i= i + 1){
            if(needle.charAt(0) == haystack.charAt(i)){
                //如果needle的第一个字符与haystack的某个字符相等,就比较后面的
                for( j = 1 ; j < len2 && i + j < len1 ; j++){
                    //依次比较后面的看是不是仍然相等
                    if(needle.charAt(j) != haystack.charAt(i + j)){
                        flag = false ;
                        break ;
                    }
                }
            }
            flag = true ;
                //若通过比较发现needle与haystack全相等,则返回i
                if(flag == true && j == len2){
                    return i ; 
                }
            
        }
      
        return -1 ;
    }
}

运行结果如下:

结论: 在数据集较少的情况下第二种方法有较好的结果。但是如果数据集非常大的话就很难说了,估计是第一种情况会好! 另外,第二种方法还有优化空间,我这里就没有继续优化,读者和网友可以试着简化。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值