leetcode_28題——Implement strStr()(KMPアルゴリズムを採用して、まだACがなくて、しかし自分のこちらのテストは間違いがありません)
2879 ワード
Implement strStr()
Total Accepted: 49294 Total Submissions: 223057 My Submissions
Question
Solution
Implement strStr().
Returns the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack.
Update (2014-11-02):The signature of the function had been updated to return the index instead of the pointer. If you still see your function signature returns a
char *
or String
, please click the reload button to reset your code definition. Hide Tags
Two Pointers String
Have you met this question in a real interview?
Yes
No
Discuss
この問題は典型的なKMPアルゴリズムの文字列マッチングの問題ですが、なぜかACがなくて、まずマッチング値を計算して、それからKMPアルゴリズムを採用して、マッチング値を計算する時私が使った方法が複雑すぎるかもしれません.
だから時間を超えた
#include <iostream>
#include <string>
#include <vector>
using namespace std;
/*" " " " */
int public_str(string str)
{
if(str.size()==1||str.size()==0)
return 0;
int i=1,len=str.size();
for(i=1;i<len;i++)
{
int flag=0;
for(int j=0;j<i;j++)
{
if(str[j]!=str[len-i+j])
{
flag=1;
break;
}
}
if(flag==0)
return i;
}
return 0;
}
/* */
vector<int> match_value(string str)
{
vector<int> temp;
int len=str.size();
for(int i=0;i<len;i++)
{
string str1=str.substr(0,i+1);
temp.push_back(public_str(str1));
}
return temp;
}
/*KMP */
int strStr(string haystack, string needle) {
if(haystack.size()==0||needle.size()==0)
return -1;
if(needle.size()>haystack.size())
return -1;
vector<int> matchvalue=match_value(needle);
int len_haystack=haystack.size();
int len_needle=needle.size();
int i=0;
while(i<=(len_haystack-len_needle))
{
int flag=0;
int noMatch=0;
int j=0;
for(j=0;j<len_needle;j++)
{
if(needle[j]!=haystack[i+j])
{
flag=1;
noMatch=j;
break;
}
}
if(flag==0)
{
return i;
}
else if(flag==1)
{
if(j==0)
i=i+1;
else
i=i+j-matchvalue[j-1];
}
}
return -1;
}
int main()
{
string str="ABGTYDFSDFRTGAAASEDF";
string str1="TYD";
cout<<strStr(str,str1)<<endl;
}