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;
    }
  }
}

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

相关文章
|
8月前
leetcode-1518:换酒问题
leetcode-1518:换酒问题
40 0
|
8月前
|
消息中间件 Kubernetes NoSQL
LeetCode 1359、1360
LeetCode 1359、1360
|
算法 Java
一和零(LeetCode 474)
一和零(LeetCode 474)
104 0
leetcode第37题
从上到下,从左到右遍历每个空位置。在第一个位置,随便填一个可以填的数字,再在第二个位置填一个可以填的数字,一直执行下去直到最后一个位置。期间如果出现没有数字可以填的话,就回退到上一个位置,换一下数字,再向后进行下去。
leetcode第37题
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第40题
会发现出现了很多重复的结果,就是因为没有跳过重复的 1。在求 opt [ 1 ] 的时候就变成了 [ [ 1 ],[ 1 ] ] 这样子,由于后边求的时候都是直接在原来每一个列表里加数字,所有后边都是加了两次了。
leetcode第40题
leetcode第53题
解法一和解法二的动态规划,只是在定义的时候一个表示以 i 开头的子数组,一个表示以 i 结尾的子数组,却造成了时间复杂度的差异。问题就是解法一中求出了太多的没必要的和,不如解法二直接,只保存最大的和。
leetcode第53题
leetcode第36题
一个 9 * 9 的数独的棋盘。判断已经写入数字的棋盘是不是合法。需要满足下边三点, • 每一行的数字不能重复 • 每一列的数字不能重复 • 9 个 3 * 3 的小棋盘中的数字也不能重复。 只能是 1 - 9 中的数字,不需要考虑数独最后能不能填满
100 0
leetcode第36题
leetcode第55题
当自己按照 45 题的思路写完的时候,看 Solution 的时候都懵逼了,这道题竟然这么复杂?不过 Solution 把问题抽象成动态规划的思想,以及优化的过程还是非常值得学习的。
100 0
leetcode第55题
leetcode第46题
这是自己开始想到的一个方法,考虑的思路是,先考虑小问题怎么解决,然后再利用小问题去解决大问题。没错,就是递归的思路。比如说, 如果只有 1 个数字 [ 1 ],那么很简单,直接返回 [ [ 1 ] ] 就 OK 了。 如果加了 1 个数字 2, [ 1 2 ] 该怎么办呢?我们只需要在上边的情况里,在 1 的空隙,也就是左边右边插入 2 就够了。变成 [ [ 2 1 ], [ 1 2 ] ]。
leetcode第46题