C語言實現最大匹配分詞
#include<stdio.h>#include<string.h>#include<time.h>void delete(char *s1, int n);int main() { int MaxLen = 5;//最大詞長 char s1[100] = "計算語言學課程是三個課時";//待切分字串 char s2[100] = "";//輸出字串 char s3[3][11] = { "計算語言學","課程","三個課時" };//詞典 clock_t first, finish; first = clock(); printf("待切分字元串是:%s 詞典是:%s,%s,%s
", s1, s3[0],s3[1],s3[2]); while (strlen(s1) != 0) { //s1為空結束 char s4[11]="";//取字串 strncat(s4, s1, 10);//將s1中十個位元組的字元追加到s4的末尾。strncat(函數的參數是指的是位元組,漢字是二個位元組,所以應該取10)strncat()把s1中的前n個位元組的字元追加到s4的末尾。 printf("取出的字元串:"); puts(s4); printf("待切分字元串:"); puts(s1); for(int t=8;t>=2;t=t-2){//取出來字串第五個數的第一個位元組是8. for (int i = 0; i <= 2; i++) {//查字典 if (strcmp(s4, s3[i]) == 0) {//字典中有字串 strcmp字元串連接函數 strcat(s2, s4);//存儲到s2中 strcat(s2, "/"); delete(s1, strlen(s4)); //把前n個位元組(一個漢字兩個位元組)刪除掉,把strlen(t) - n個位元組往前移動,並且改變strlen(t)的大小 t = 0;//改變外層循環的值來跳出雙重循環 } } s4[t]= ; //將字串最右邊的字刪除掉 if (strlen(s4) ==2) {//字串是單字,劃分(一個漢字佔兩個位元組) strcat(s2, s4); strcat(s2, "/"); delete(s1, strlen(s4)); break; } } } finish = clock(); printf("所用的時間為:%lf
", (double)(finish - first)/ CLOCKS_PER_SEC); printf("劃分的字元串為:%s", s2); return 0; }void delete(char *s1, int n) {//處理字元串函數,功能:把前n個位元組(一個漢字兩個位元組)刪除掉,把strlen(t)-n個位元組往前移動,並且改變strlen(t)的大小。 int m = 0; if ((strlen(s1) >= 4) && (strlen(s1) != n)) {//s1中有兩個以上的字且這兩個字不是詞典里的詞 for (int i = 0, t = n; s1[t]; i = i + 2, t = t + 2) { s1[i] = s1[t]; s1[i + 1] = s1[t + 1]; m = i; } } if ((strlen(s1) == n)) {//最後的詞是詞典里的詞 s1[0] = ; return; } if (strlen(s1) == 2) {//只剩最後一個字 s1[0] = ; return; } s1[m + 2] = ;}
推薦閱讀:
※重建二叉樹
※精選 TOP45 值得學習的Python項目
※演算法導論第一課
※偽·從零開始學演算法 - 1.2 演算法的歷史