15.5問題8 K回以上重複する最長の部分文字列を探索
[前回の基本形に重複する回数を数える部分を追加しただけ.
入力に作ったテキストの末尾に,勝手に改行が追加されて鬱陶しかったのでヌル文字で上書き. :p
// K回以上重複するフレーズを探索する void find_common_word(FILE * fp, int N, int K){ char * buff = new char[N]; char ** suffix = new char*[N]; char c; int i; for(i=0; (c=fgetc(fp))!=EOF && i<N-1; i++){ buff[i] = c; if(buff[i]=='\n'){ buff[i]='\0'; } suffix[i] = &buff[i]; } buff[i]='\0'; suffix[i] = &buff[i]; print_words(suffix, i); typedef int (*cmp_func)(const void*,const void*); qsort(suffix, i, sizeof(char*), (cmp_func)&strcmp2); print_words(suffix, i); int maxlen=0; int maxindex=-1; bool keep=false; for(int k=0,count=0; k<i-1; k++){ int len=strlen(suffix[k]); int j; for(j=0; k+j<i-1; j++){ int comlen=common_length(suffix[k], suffix[k+j]); if(comlen<len){ break; } } if(j>K && len>maxlen){ // K回以上重複した? maxlen=len; maxindex=k; } } if(maxindex>=0){ cout << "maxlen=" << maxlen << endl; cout << "maxindex=" << maxindex << endl; cout << "string=[" << endl; cout << "\t[" << suffix[maxindex] << "]" << endl; cout << "\t[" << suffix[maxindex+1] << "]" << endl; } delete buff; delete suffix; }
「珠玉のプログラミング」読み終わった〜!やたー!
まとめは今度書く.
まぁ既に次が積み上がってるわけですが….(Amazon仕事しすぎだろjk)