leetcode28 Implement strStr()
class Solution {
public:
int strStr(string haystack, string needle) {
if(needle.size()<1) return 0;
if(haystack.size()<1 || haystack.size()<needle.size()){
return -1;
}
int maxPos = haystack.size() - 1;
int moveStep =0;
int needleInHayHeadCursor = 0;
vector<int> moveMap;
map<char,int> lastOccurrMap;
int i=0;
int needleCursor = needle.size() - 1;
while(needleCursor >= 0) {
moveMap.push_back(1);
needleCursor--;
}
int sizeGap = haystack.size() - needle.size();
while(needleInHayHeadCursor <= sizeGap){
moveStep = 1;
//cout<<"needleInHayHeadCursor:"<<needleInHayHeadCursor<<" loop: ";
for(i=0;i<needle.size();i++){
//cout<<" "<<needle[i]<<"-"<<haystack[needleInHayHeadCursor+i];
if(needle[i]!=haystack[needleInHayHeadCursor+i]){
break;
}
}
//cout<<" :loop "<<i<<" ";
if(i==needle.size()){
return needleInHayHeadCursor;
}else{
needleCursor = i - 1;//cout<<" movestep:";
lastOccurrMap.clear();
while(needleCursor >= 0) {
if(lastOccurrMap.find(needle[needleCursor]) == lastOccurrMap.end()){
moveMap[needleCursor] = i - needleCursor;
}else{
moveMap[needleCursor] =lastOccurrMap[needle[needleCursor]] - needleCursor ;
}
lastOccurrMap[needle[needleCursor]] = needleCursor;
//cout<<" "<<lastOccurrMap[needle[needleCursor]];
//cout<<" "<<moveStep;
moveStep = moveMap[needleCursor] > moveStep ? moveMap[needleCursor] : moveStep;
needleCursor--;
}
if(lastOccurrMap.find(haystack[needleInHayHeadCursor+i]) == lastOccurrMap.end()){
moveStep = i+1 ;
}
//cout<<":movestep"<<moveStep<<endl;
needleInHayHeadCursor += moveStep;
}
}
return -1;
}
};