题目:
Implement strStr().
Return the index of the first occurrence of needle in haystack,
or -1 if needle is not part of haystack.
Example 1:
Input: haystack = "hello", needle = "ll"
Output: 2
Example 2:
Input: haystack = "aaaaa", needle = "bba"
Output: -1
Clarification:
What should we return when needle is an empty string?
This is a great question to ask during an interview.
For the purpose of this problem, we will return 0 when needle is an empty string.
This is consistent to C's strstr() and Java's indexOf().
我的答案1(偷懒直接用 Java 内置的 indexOf(str)):
class Solution {
public int strStr(String haystack, String needle) {
return haystack.indexOf(needle);
}
}
我的答案2(参照源码实现了一遍 Java 的 indexOf(str)):
效率比直接用
indexOf(str)
低,猜测是因为频繁调用charAt(index)
方法,因为关键代码一样,个人觉得主要问题还是出在里面得到字符的方法是直接用char[]
的下标直接得到,我这里还隔了一个charAt()
方法。有空再看看相应源码。
class Solution {
public int strStr(String haystack, String needle) {
if(needle.isEmpty()) {
return 0;
}
char firstChar = needle.charAt(0);
int max = haystack.length() - needle.length();
for(int i = 0; i <= max; i++) {
//Look for first character.
if(haystack.charAt(i) != firstChar) {
while(++i <= max && haystack.charAt(i) != firstChar);
}
//Look at the rest of v2
if(i <= max) {
int j = i + 1;
int end = j + needle.length() - 1;
for(int k = 1; k < needle.length() && j < end
&& haystack.charAt(j) == needle.charAt(k); k++, j++);
if(j == end) {
return i;
}
}
}
return -1;
}
}