ÕâµÀÌⲻҪȥ¿¼ÂÇʲô 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;
}
};