题目:写一个在一个字符串(n)中寻找一个子串(m)第一个位置的函数 先来一个非KMP算法 int findSubString(char* pBase, char* pSource) { if(pBase == NULL || pSource == NULL) return 0; char* pSourceHead = pSource; char* pBaseHead = pBase; int nMatchCount = 0; while(*pBase != '/0' && *pSource != '/0') { if(*pBase == *pSource) { pBase++; pSource++; nMatchCount++; } else { pSource = pSourceHead; // 回溯到开头 pBase = pBase - (nMatchCount-1)*sizeof(char); // 回溯到第一个比对位置后一个位置 nMatchCount = 0; } } if(*pSource == '/0') return pBase - pBaseHead - nMatchCount+1; else return 0; } 关键在于 每次遇到不同 2个串都要回溯到开头 KMP算法精髓: 基准串不回溯 只回溯子串 回溯准则: 1. 尽量大 2. 镜面对称