您的位置:首页 > 其它

leetcode28 Implement strStr()

2017-11-08 14:10 323 查看
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;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode