ÕâµÀÌⲻҪȥ¿¼ÂÇʲô Rabin-Karp, KMP »òÊÇ Boyer-Moore Ëã·¨£¬Õâ¾ÍÊÇÒ»µÀ Easy ÄѶȵĻù´¡Ìâ¡£

¿¼²ìµÄÊǶÔÓÚ×Ö·û´®Ö¸ÕëµÄʹÓá£


ÎÒÃÇÔÚÁ´±íÌâÖÐǧ´¸°ÙÁ¶£¬ÒÔΪÁ·¾ÍÁËÒ»Éíµ¯Ö¸ÉñͨµÄÓ²¹¦·ò¡£¿ÉÊÇÓöµ½ÕâÒ»Ì⣬¶«Ð°ÃÅÈË¿ÖÅÂÒª³Ô¿÷¡£¿÷¾Í¿÷ÔÚ×Ö·û´®Ö¸ÕëµÄÌØÊâÐÔ¡£

ÄÄÀïÌØÊâÄØ£¿

ÔÚÁ´±íÖУ¬ÎÒÃÇͨ³£»áÅжÏÒ»¸öÖ¸ÕëÊÇ·ñΪ nullptr, Èç if (p) //....

µ«ÔÚ×Ö·û´®Ö¸ÕëÖУ¬ÕâÑùµÄÅжÏͨ³£Ã»ÓÐÈκÎÒâÒå¡£¶ÔÓÚ×Ö·û´®£¬¾ÙÀý˵Ã÷£º

    "hello,world"

ÔÚÄÚ´æÖеIJ¼¾Öʵ¼ÊÊÇÕâÑù£º

|h|e|l|l|o|,|w|o|r|l|d|\0|
                            ^
                            p

ÈçºÎÅжÏÒ»¸öÖ¸Ïò×Ö·û´®µÄÖ¸ÕëÒѾ­×ßµ½Á˾¡Í·£¿ÈçÉÏͼ p Ö¸ÏòµÄÊÇ \0, ÄÇôÏÔÈ»´Ëʱ p != nullptr, ÒòΪËüÃ÷ÏÔÖ¸ÏòÁËÒ»¸ö×Ö·û¡£µ«Õâ¸ö×Ö·û·Ç³£ÌØÊ⣬ÎÒÃÇ³ÆÆäΪ null character, Èç¹ûÎÒÃǶԸÃÖ¸Õëȡֵ£¬µÃµ½ *p, ¿ÉÒԵõ½ *p == 0¡£

ÕâÊÇÒ»¸ö·Ç³£ÖØÒªµÄ½áÂÛ¡£ËùÒÔÎÒÃÇÔÚ×Ö·û´®Ö¸ÕëÖУ¬Í¨³£Ê¹ÓõÄÅжÏÊÇÖîÈç if (!*p) //... ÕâÑùµÄ¡£


»Øµ½ÕâµÀÌ⣬ÊǷdz£»ù±¾µÄ˼·¡£µü´úÖ¸Õë p, ´Ó 0 µü´úµ½ n-m+1. (ΪʲôÊÇ n-m+1 ? n ÊÇ haystack µÄ³¤¶È£¬m ÊÇ needle µÄ³¤¶È£¬µ« p Ö¸ÏòµÄºóÐø×Ö·û¸öÊýСÓÚÁË needle µÄ×Ö·û¸öÊý£¬ÎÞÂÛÈçºÎ¶¼ÎÞ·¨Æ¥ÅäÉÏÁË£¬ËùÒÔ¼ÌÐøµü´úºÁÎÞÒâÒå¡£)

µü´ú¹ý³ÌÖУ¬ÎÒÃÇÉèÖÃÁ½¸öÁÙʱָÕë p1, p2, ·Ö±ð±éÀú haystack Óë needle. ÖðÒ»±È½Ï£¬Èô³öÏÖ²»·ûÔò¼ÌÐø½øÐÐÏÂÒ»´Îµü´ú¡£Ò»Ö±ÎǺϣ¬µ« p1 »òÊÇ p2 ÓÐÈÎÒâÒ»¸ö×ßµ½¾¡Í·£¬ÄÇô¼ÓÒÔÅжϣº

if (!*p2) return p-haystack; // needle È«²¿Æ¥ÅäÉÏÁË£¬·µ»ØÎ»Öá£
else if (!*p1) break; // ÒѾ­µ½´ï n-m+1 ·¶Î§

ʣϲ»±í¡£

class Solution {
public:
    int strStr(char *haystack, char *needle) {
        if (!*haystack && !*needle) return 0;
        char *p = haystack;
        while (*p) {
            char *p1 = p, *p2 = needle;
            while (*p1 && *p2 && *p1 == *p2) {
                ++p1;
                ++p2;
            }
            if (!*p2) return p-haystack;
            else if (!*p1) break;
            ++p;
        }
        return -1;
    }
};

LeetCode Direct Link