文字列の操作いろいろ

Boyer-Moore法

void table(char *key) {
	int len = strlen(key);
	fill(skip, skip+CHAR_SET, len);

	for(int i = 0; i < len-1; i++) {
		skip[key[i]] = len-1-i;
	}

}

//位置取得。戻り値はインデックス
int search(char* text, char* key) {
	int textlen = strlen(text);
	int keylen = strlen(key);

	int ans = -1;
        //i++とすると、余分に1つすすむことになるので、やらない。
	for(int i = keylen-1; i < textlen;i++) {
		for(int j = 0; j <= keylen-1; j++) {
			//最後尾から先頭まで走査
			if(text[i-j] != key[keylen-1-j]) {
				i += skip[text[i-j]];
				break;
			}
			//見つかった
			ans = i-(keylen-1);
		}
		//見つかったら抜ける
		if(ans != -1) {
			break;
		}
	}
	return ans;

}

テーブルを作って、操作する。スキップできたり便利な半面、
textの文字数が少なかったりすると、時間が余計にかかりそう。