实现 strStr()

一、题目

实现 strStr() 函数。

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

来源:力扣(LeetCode)
LeetCode链接

二、解题思路

(1)暴力求解
          leetcode把这道题归类为简单,那必然要寻找简单解法。下面第一个代码是个可以行的通的方法,但是由于时间复杂度太高,最后一个测试用例没有通过。但是第二个代码是可以的。
(2)内置函数indexOf,不建议

	int result = haystack.indexOf(needle);
	return result;

(2)KMP算法
          略

三、代码

public class Solution {
    public int strStr(String haystack, String needle) {
        // 特殊情况
        if (!haystack.equals("") && needle.equals("")) {
            return 0;
        }
        if (haystack.equals("") && needle.equals("")) {
            return 0;
        }
        if (haystack.length() < needle.length()) {
            return -1;
        }
        for (int i = 0; i < haystack.length(); i++) {
            int cur = i;
            // 子串从当前父串的位置开始进行匹配
            for (int j = 0; j < needle.length() && cur < haystack.length(); j++) {
                // 两个字符比较
                if (needle.charAt(j) == haystack.charAt(cur)) {
                    if (j == (needle.length() - 1) && haystack.charAt(cur) == needle.charAt(j)) {
                        return i;
                    }
                    cur++;
                    continue;
                } else {
                    break;
                }
            }
        }
        return -1;
    }
}

上面的代码复杂度过高,在不使用KMP算法的前提先,进行改进,下面是一同学的解法

class Solution {
    public int strStr(String haystack, String needle) {
        if(null==needle   || needle.length()==0)    return 0;
        if(null==haystack || haystack.length()==0)  return -1;
        char[] h = haystack.toCharArray();
        char[] n = needle.toCharArray();
        to: for (int i = 0; i <h.length-n.length+1; i++) { //要避免里层for的h索引越界
            for (int j = 0; j <n.length ; j++) {           //从h[i]开始,依次比较h和n的每个字符
                if (h[i+j]!=n[j])
                continue to;                               //只要发现不同,就停止比较,跳到h[i+1]
            }
            return i;                                      //h[i]后面的字符和n全部相同才会返回i
        }
        return -1;    
    }
}

注意:两个代码本质上都是暴力求解,但是为什么下面的代码可以运行?答案就在于父串haystack需要遍历的次数,上面是haystack.length(),下面是haystack.length() - needle.length()+1。通过减少遍历次数来降低复杂度。这样我们发现,第一个代码通过修改后也能顺利通过。

发布了76 篇原创文章 · 获赞 42 · 访问量 1万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览