这个是个easy的题目,首先想到直接用String.indexOf()方法直接求,但觉得很耻辱!!!于是有了如下思路:遍历整个文本串(长度为m),比对文本串字母与目标串(长度为n)首字母是否相同,如果相同就检查模式串后面的字母是否相同,但是越简单的题目越容易有小bug,尤其这里面两个循环里的的break处理的有点大意了。这个思路非常普通,时间复杂度O(mn)。KMP算法应该是最优的结果。
class Solution {
public int strStr(String haystack, String needle) {
if(needle.length()==0)
return 0;
int patlen=needle.length();
int txtlen=haystack.length();
if(patlen>txtlen)
return -1;
for(int i=0;i<haystack.length();i++)
{
if(haystack.charAt(i)==needle.charAt(0))
{
if(i+patlen-1>=txtlen)
return -1;
int j=1;
for(;j<patlen;j++)
{
if(haystack.charAt(i+j)!=needle.charAt(j))
break;
}
if(j==patlen)
return i;
}
}
return -1;
}
}
运用朴素的Rabin-Karp algorithm代码如下,详细知识请看https://blog.csdn.net/To_be_to_thought/article/details/85038546
class Solution {
public static int base=256;
public static int module=101;
public static boolean match(String str1,String str2)
{
assert str1.length()==str2.length();
for(int i=0;i<str1.length();i++)
{
if(str1.charAt(i)!=str2.charAt(i))
return false;
}
return true;
}
public static int hash(String str)
{
int hash=0;
for(int i=0;i<str.length();i++)
hash=(hash*base+str.charAt(i))/module;
return hash;
}
public int strStr(String haystack, String needle) {
if(needle=="" || needle.length()==0)
return 0;
int n=haystack.length(),m=needle.length();
int targetHash=hash(needle);
for(int i=0;i<n-m+1;i++)
{
String str=haystack.substring(i,i+m);
if(hash(str)==targetHash)
if(match(str,needle))
return i;
}
return -1;
}
}
运用rollinghash的Rabin-Karp algorithm代码如下:
class Solution {
public static int base=256;
public static int module=101;
public static boolean match(String str1,String str2)
{
assert str1.length()==str2.length();
for(int i=0;i<str1.length();i++)
{
if(str1.charAt(i)!=str2.charAt(i))
return false;
}
return true;
}
public int strStr(String haystack, String needle) {
if(needle=="" || needle.length()==0)
return 0;
int m=needle.length(),n=haystack.length(),h=1;
if(n==0 || n<m)
return -1;
for(int i=0;i<m-1;i++)
h=(h*base)%module;
int p=0,t=0;
for(int i=0;i<m;i++)
{
p=(p*base+needle.charAt(i))%module;
t=(t*base+haystack.charAt(i))%module;
}
for(int i=0;i<n-m+1;i++)
{
if(t==p)
{
if(match(needle,haystack.substring(i,i+m)))
return i;
}
if(i<n-m)
{
t=( base * (t-haystack.charAt(i) * h) + haystack.charAt(i+m) )%module;
if(t<0)
t=t+module;
}
}
return -1;
}
}
当然肯定可以用大名鼎鼎的KMP算法求解。