leetcode28 Implement strStr()

来源:互联网 发布:美化桌面的软件 编辑:程序博客网 时间:2024/05/21 13:21

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;    }};