You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

59 lines
1.4 KiB

2 years ago
#include<iostream>
using namespace std;
//KMP<4D>㷨 ֮<>Ҿ<EFBFBD><D2BE><EFBFBD><EFBFBD>Լ<EFBFBD>˵<EFBFBD>úܺö<DCBA>
//https://www.jianshu.com/p/c372a287ba79
unsigned long getNext(string maxStr) {
//<2F><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>ij<EFBFBD><C4B3><EFBFBD>
unsigned long length = maxStr.size();
string str1;
string str2;
int subLen = 0;
for (int i = 1 ; i < length; ++i) {
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
str1 = maxStr.substr(0,i);
str2 = maxStr.substr(length-i,length);
if(str2 == str1) {
//<2F>Ƚ<EFBFBD>
subLen = i;
}
}
return length - subLen;
}
int main() {
/*
Ŀ<EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>:asabusakswwlsaksaksawlsdkiis
ƥ<EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>:saksawl
*/
string deStr("asabusakswwlsaksaksawlsdkiis");
string keyStr("saksawl");
//1.<2E><>ƥ<EFBFBD><C6A5>,<2C>ҵ<EFBFBD>ƥ<EFBFBD><EFBFBD><E4B5BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>,<2C><>Ҫһ<D2AA><D2BB><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>maxStr<74><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
string maxStr("");
unsigned long steps;
int length; //<2F><><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD>м<EFBFBD><D0BC>㵱ǰ<E3B5B1><C7B0><EFBFBD><EFBFBD>
//2.<2E><>ʼƥ<CABC><C6A5>
for (int i = 0; i < (deStr.size() - keyStr.size());) {
length = 0;//ÿ<><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>length<74><68>0
steps = 1;//ÿ<><C3BF>ƽ<EFBFBD><C6BD>һ<EFBFBD>ξ<EFBFBD><CEBE><EFBFBD><EBB6BC><EFBFBD>¼<EFBFBD><C2BC><EFBFBD>ƽ<EFBFBD>Ƶľ<C6B5><C4BE><EFBFBD>
for (int j = i; j < (keyStr.size() + i); ++j) {
if (deStr.at(j) != keyStr.at(j-i)) {
if ( length > 1) {
maxStr = keyStr.substr(0,length);
steps = getNext(maxStr); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫһ<D2AA><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٴ<EFBFBD>
}
break; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰѭ<C7B0><D1AD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD>
}
++length; //ƥ<><C6A5><EFBFBD>ɹ<EFBFBD><C9B9>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD>1
if (length == keyStr.size()) {
cout << "ƥ<EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>" << endl;
return 0;
}
}
i += steps;
}
cerr << "ƥ<EFBFBD><EFBFBD>ɹ<EFBFBD>";
return -1;
}