Implement strStr()基本方法和反向思维和优质解法解析

今天做的是LeetCode27。题目要求是找到字符串中子字符串第一次出现的序号,当未找到时返回-1

基本思路就是一个个字符进行比对

一开始想的是从第一个字符开始一直向后

代码如下:

	public int strStr(String haystack, String needle) {		
		if((haystack.length()==0)&&(needle.length()==0))
			return 0;
		if(haystack.length()<needle.length())
			return -1;
		int i=0,j=0;
		for(;i+j<haystack.length();i++){
			j=0;
			while (i+j<haystack.length()&&j<needle.length()){
				if(haystack.charAt(i+j)!=needle.charAt(j))
					break;
				else
					j++;
			}
			if(j==needle.length())
				return i;
		}
		return -1;
        
    }

不难理解,就是需要注意边界情况

在完成基本方法之后,突然想到,如果之前的字符都是相同的,但只有最后一个字符是不相同的,那岂不是会浪费很多的时间。突然想到,可不可以想比较最后一个字符,之后再向前比较。亲测,也的确比之前快很多。

代码如下:

	public int strStr(String haystack, String needle) {		
		if((haystack.length()==0)&&(needle.length()==0))
			return 0;
		if(haystack.length()<needle.length())
			return -1;
		//如果要是从后向前找会不会快一点
		int i=0,j=needle.length();
		for(;i+j<haystack.length();i++){
			j=0;
			while (i+j<haystack.length()&&j>-1){
				if(haystack.charAt(i+j)!=needle.charAt(j))
					break;
				else
					j--;
			}
			if(j==-1)
				return i;
		}
		return -1;
        
    }


这个方法与第一个的思路相同,但要比我写的优美,简洁:
public int strStr(String haystack, String needle) {
  for (int i = 0; ; i++) {
    for (int j = 0; ; j++) {
      if (j == needle.length()) return i;
      if (i + j == haystack.length()) return -1;
      if (needle.charAt(j) != haystack.charAt(i + j)) break;
    }
  }
}
以下是我目前为止最喜欢的一种解法:
public class Solution {
    public int strStr(String haystack, String needle) {
        int l1 = haystack.length(), l2 = needle.length();
        if (l1 < l2) {
            return -1;
        } else if (l2 == 0) {
            return 0;
        }
        int threshold = l1 - l2;
        for (int i = 0; i <= threshold; ++i) {
            if (haystack.substring(i,i+l2).equals(needle)) {
                return i;
            }
        }
        return -1;
    }
}
最好的一点是令threshold为两个字符串的长度差,不再同之前一样一个个字符的比较,而是一个个字字符串的比较了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值