Description:
Implement strStr().
Returns the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack.
问题描述
在源字符串中找目标字符串,如果有,返回第一次出现的首字母索引,否则返回-1..
解法一:
思路:
来个暴搜解法。。。
Code:
public class Solution {
public int strStr(String haystack, String needle) {
if (needle == null || haystack == null){
return -1;
}
if (needle.equals("")){
return 0;
}
int l = needle.length();
for (int i = 0; i <= haystack.length() - l; i++){
if (haystack.substring(i,i+l).equals(needle)){
return i;
}
}
return -1;
}
}
解法二:
思路:
Robin-Karp算法,用Hash函数
Code:
public class Solution {
public int strStr(String haystack, String needle) {
int BASE = 1000000;
if (haystack == null || needle == null){
return -1;
}
int m = needle.length();
if (m == 0){
return 0;
}
//31^m
int power = 1;
for (int i = 0; i < m; i++){
power = (power * 31) % BASE;
}
int needleCode = 0;
for (int i = 0; i < m; i++){
needleCode = (needleCode * 31 + needle.charAt(i)) % BASE;
}
int hashCode = 0;
for (int i = 0; i < haystack.length(); i++){
//abc + d
hashCode = (hashCode * 31 + haystack.charAt(i)) % BASE;
if (i < m - 1){
continue;
}
//i
//abcd - a
if (i >= m){
hashCode = hashCode - (haystack.charAt(i - m) * power) % BASE;
if (hashCode < 0){
hashCode += BASE;
}
}
//double check the string
if (hashCode == needleCode){
if (haystack.substring(i - m + 1, i + 1).equals(needle))
return i - m + 1;
}
}
return -1;
}
}