字符串匹配算法
朴素字符串匹配算法
void nativeStringMatchar(string str, string com){
for(int i = 0; i <= int(str.length()-com.length()); i++){
bool judge = true;
for(int j = 0; j < int(com.length()); j++){
if(str[j+i] != com[j]){
judge = false;
break;
}
}
if(judge) cout << i << ' ';
}
}
Rabin-Karp算法
void rabinKarp(string str, string com){
int hStr = 0, hCom = 0;
int lCom = com.length();
int lStr = str.length();
int d = (1<<(lCom-1));
for(int i = 0; i < lCom; i++){
hStr = (hStr<<1) + str[i];
hCom = (hCom<<1) + com[i];
}
for(int i = 0; i <= lStr - lCom; i++){
if(hStr == hCom){
bool judge = true;
for(int j = 0; j < lCom; j++){
if(str[i+j] != com[j]){
judge = false;
break;
}
}
if(judge) cout << i << ' ';
}
if(i != lStr-lCom)
hStr = ((hStr-str[i]*d)<<1) + str[i+lCom];
}
}
void rabinKarpForBig(string str, string com){
int hStr = 0, hCom = 0;
int lCom = com.length();
int lStr = str.length();
int q = 13;
int d = (1<<(lCom-1))%q;
for(int i = 0; i < lCom; i++){
hStr = ((hStr<<1) + str[i])%q;
hCom = ((hCom<<1) + com[i])%q;
}
for(int i = 0; i <= lStr - lCom; i++){
if(hStr == hCom){
bool judge = true;
for(int j = 0; j < lCom; j++){
if(str[i+j] != com[j]){
judge = false;
break;
}
}
if(judge) cout << i << ' ';
}
if(i != lStr-lCom){
hStr = (((hStr-str[i]*d)<<1) + str[i+lCom])%q;
if(hStr < 0) hStr += q;
}
}
}
有限自动机算法
void makeJumpTable(string p){
int m = p.length();
int alphaSize = 4;
for(int q = 0; q <= m; q++)
for(int k = 0; k < alphaSize; k++){
char c = (char)('1' + k);
string Pq = p.substr(0, q) + c;
int nextState = findSuffix(Pq, p);
cout << "from state " << q << " receive input char " << c << " jump to state " << nextState << endl;
map<char, int> m = jumpTable[q];
m[c] = nextState;
jumpTable[q] = m;
}
}
int match(string T, string p){
int q = -1;
for(int n = 0; n <= int(T.length()); n++){
map<char, int> m = jumpTable[q];
int oldState = q;
q = m[T[n]];
if(q == -1) return -1;
cout << "In state " << oldState << " receive input " << T[n] << " jump to state " << q << endl;
if(q == int(p.length())) cout << n << ' ';
}
return -1;
}
KMP算法
int Pi[500];
int getLongestSuffix(int s, string P) {
if(s <= 0 || s > int(sizeof(Pi)/4)) return -1;
if(Pi[s] != -2) return Pi[s];
Pi[s] = 0;
int k = getLongestSuffix(s-1, P);
do{
if(P[k] == P[s-1]) return Pi[s] = k + 1;
if(k > 0) k = getLongestSuffix(k, P);
}while(k > 0);
return Pi[s];
}
int KMP(string T, string P) {
int m = P.length();
for(int i = 0, q = 0; i < int(T.length()); i++) {
while(q > 0 && P[q] != T[i]) q = Pi[q];
if(P[q] == T[i]) q = q + 1;
if(q == m) return i-m+1;
}
return -1;
}
笔面高频题
单词间的逆序调整
string wordInvert(string str){
string result;
int end;
end = str.length();
for(int i = str.length(); i >= 0; i--){
if(str[i] == ' ' || i == 0) {
if(i != 0)
result += str.substr(i+1, end-i-1);
else
result += str.substr(i, end-i+1);
if(i != 0)
result += " ";
end = i;
}
}
return result;
}
void invert(string& str, int start, int end){
int len = end - start + 1;
for(int i = start; i < start + len/2; i++){
char tmp = str[i];
str[i] = str[start+len-(i-start)-1];
str[start+len-(i-start)-1] = tmp;
}
}
前n字符后移
string wordInvert(string str, int index){
invert(str, 0, str.length()-1);
invert(str, 0, str.length()-index-2);
invert(str, str.length()-index-1, str.length()-1);
return str;
}
两字字符按照字典序最小拼接
string wordJoin(string one, string two){
string tOne = one+two, tTwo = two+one;
int lOne = int(tOne.length()), lTwo = int(tTwo.length());
int len = lOne > lTwo ? lOne : lTwo;
for(int i = 0; i < len; i++){
if(lOne < i+1 && lTwo >= i+1)
return tOne;
else if(lTwo < i+1 && lOne >= i+1)
return tTwo;
else if(lTwo == lOne && lTwo == i+1)
return tTwo;
else if(tOne[i] < tTwo[i])
return tOne;
else if(tOne[i] > tTwo[i])
return tTwo;
}
}
判断两个字符串是否互为旋转词
bool judgeRotateWord(string one, string two){
if(one.length() != two.length())
return false;
string tmp = one+one;
if(KMP(tmp, two))
return true;
return false;
}