leetcode第28题

简介: 返回一个字符串 needle 在另一个字符串 haystack 中开始的位置,如果不存在就返回 -1 ,如果 needle 长度是 0 ,就返回 0 。就是一一比较就好,看下代码吧。

image.png

返回一个字符串 needle 在另一个字符串 haystack 中开始的位置,如果不存在就返回 -1 ,如果 needle 长度是 0 ,就返回 0 。

就是一一比较就好,看下代码吧。

publicintstrStr(Stringhaystack, Stringneedle) {
if (needle.length() ==0) {
return0;
    }
intj=0;
//遍历每个字符for (inti=0; i<haystack.length(); i++) {
//相等的话计数加 1 if (haystack.charAt(i) ==needle.charAt(j)) {
j++;
//长度够了就返回if (j==needle.length()) {
returni-j+1;
            }
// 不相等的话 j 清零,// 并且 i 回到最初的位置,之后就进入 for 循环中的 i++,从下个位置继续判断        } else {
i=i-j;
j=0;
        }
    }
return-1;
}

时间复杂度:假设 haystack 和 needle 的长度分别是 n 和 k,对于每一个 i ,我们最多执行 k - 1 次,总共会有 n 个 i ,所以时间复杂度是 O(kn)。

空间复杂度:O(1)。

我们再看下别人的代码,用两个 for 循环。但本质其实是一样的,但可能会更好理解些吧。

publicintstrStr(Stringhaystack, Stringneedle) {
for (inti=0; ; i++) {
for (intj=0; ; j++) {
if (j==needle.length()) returni;
if (i+j==haystack.length()) return-1;
if (needle.charAt(j) !=haystack.charAt(i+j)) break;
    }
  }
}

总的来说,还是比较简单的,就是简单的遍历就实现了。

相关文章
|
6月前
LeetCode
LeetCode
40 0
|
6月前
leetcode-1219:黄金矿工
leetcode-1219:黄金矿工
81 0
顺手牵羊(LeetCode844.)
好多同学说这是双指针法,但是我认为叫它顺手牵羊法更合适
80 0
LeetCode 389. 找不同
给定两个字符串 s 和 t,它们只包含小写字母。
78 0
|
算法 Python
LeetCode 386. Lexicographical Numbers
给定一个整数 n, 返回从 1 到 n 的字典顺序。
85 0
LeetCode 386. Lexicographical Numbers
|
算法
leetcode第42题
也就是红色区域中的水, 数组是 height = [ 0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1 ] 。 原则是高度小于 2,temp ++,高度大于等于 2,ans = ans + temp,temp = 0。 temp 初始化为 0 ,ans 此时等于 2。 height [ 0 ] 等于 0 < 2,不更新。 height [ 1 ] 等于 1 < 2,不更新。 height [ 2 ] 等于 0 < 2, 不更新。 height [ 3 ] 等于 2 >= 2, 开始更新 height [ 4 ] 等于 1 < 2,temp = temp + 1 = 1。 h
104 0
leetcode第42题
leetcode第36题
一个 9 * 9 的数独的棋盘。判断已经写入数字的棋盘是不是合法。需要满足下边三点, • 每一行的数字不能重复 • 每一列的数字不能重复 • 9 个 3 * 3 的小棋盘中的数字也不能重复。 只能是 1 - 9 中的数字,不需要考虑数独最后能不能填满
leetcode第36题
leetcode第55题
当自己按照 45 题的思路写完的时候,看 Solution 的时候都懵逼了,这道题竟然这么复杂?不过 Solution 把问题抽象成动态规划的思想,以及优化的过程还是非常值得学习的。
leetcode第55题
leetcode第38题
难在了题目是什么意思呢? 初始值第一行是 1。 第二行读第一行,1 个 1,去掉个字,所以第二行就是 11。 第三行读第二行,2 个 1,去掉个字,所以第三行就是 21。 第四行读第三行,1 个 2,1 个 1,去掉所有个字,所以第四行就是 1211。 第五行读第四行,1 个 1,1 个 2,2 个 1,去掉所有个字,所以第五航就是 111221。 第六行读第五行,3 个 1,2 个 2,1 个 1,去掉所以个字,所以第六行就是 312
leetcode第38题
|
算法
leetcode第45题
时间复杂度:O(n)。 空间复杂度:O(1)。 这里要注意一个细节,就是 for 循环中,i < nums.length - 1,少了末尾。因为开始的时候边界是第 0 个位置,steps 已经加 1 了。如下图,如果最后一步刚好跳到了末尾,此时 steps 其实不用加 1 了。如果是 i < nums.length,i 遍历到最后的时候,会进入 if 语句中,steps 会多加 1 。
107 0
leetcode第45题