题目描述
实现strStr()
函数。
给定一个haystack
字符串和一个needle
字符串,在haystack
字符串中找出needle
字符串出现的第一个位置(从0
开始)。如果不存在,则返回-1
.
示例1:
输入: haystack = “hello”, needle = “ll”
输出: 2
示例2:
输入: haystack = “aaaa”, needle = “bba”
输出: -1
说明: 当needle
是空字符时,我们应当返回什么值呢?这是一个在面试中很好的问题。对于题目而言,当needle
是空字符串时,我们应当返回0
。这与C
语言以及Java
的IndexOf()
定义相符。
思路分析
这道题难度为简单, 通过题意我们可知,通过简单的遍历可以完成题目要求,在遍历过程中我们需要判断第一个字符满足相同的下标,之后我们再对比needle
的每个字符;这里我们直接给出代码:
解题代码
public static int solution(String haystack, String needle) {
if (needle == null || needle == "") {
return 0;
}
for (int i = 0; i <= haystack.length() - needle.length(); i++) {
if (haystack.substring(i, i + needle.length()).equals(needle)) {
return i;
}
}
return -1;
}
拓展
- 在力扣官方解析中,给出了滚动哈希的解法,感兴趣的小伙伴可以去看一下。
- 字符串类型的题目与链表类型的题目差异还是比较明显的,甚至解题思路有些相反:链表是通过时间换空间 ,我们在解题链表时,一开始总是习惯性的借助辅助容器来简化实现过程,但是大部分都可以通过增加指针的个数来减少辅助容器的使用;字符串是通过空间换时间,字符串的暴力解法在大数据或者大体量数据对象场景下会导致反应时间过长,用户体验差等现象,这时我们的改进就是依赖于空间的辅助来减少时间上的消耗。这和两者的应用场景以及特性都有关系,希望这里有一个简单的记忆及理解。
复杂度分析
这里我们设S
为haystack
字符串的长度;l
为needle
字符串的长度;
时间复杂度: 已知for
循环为S-l
;字符比对为l
个字符, 故这里时间复杂度为o(l(S-l))
空间复杂度: 我们没有使用辅助容器,故这里为O(1)
。
Github源码
完整可运行文件请访问GitHub。