1. 程式人生 > 其它 >單詞檢查(Ⅰ)- 順序表實現

單詞檢查(Ⅰ)- 順序表實現

技術標籤:資料結構資料結構演算法

一、題目

如果輸入檔案中有詞vake ,檢查程式就能發現其是一個錯誤的單詞,並且給出 bake, cake或vase做為修改建議單詞。
修改建議單詞可以採用如下生成技術:
(1)在每一個可能位置插入‘a-‘z’中的一者
(2)刪除單詞中的一個字元
(3)用‘a’-'z’中的一者取代單詞中的任一字元

二、分析
首先存入詞典。然後查詢,如果查到則over。沒查到,進入修改系統。
(1)在每一個可能位置插入‘a-‘z’中的一者,如果字典比該詞的長度大一,比較兩者的區別,如果滿足條件,則輸出。
(2)刪除單詞中的一個字元:如果字典比該詞的長度小一,比較兩者的區別,如果滿足條件,則輸出。

(3)用‘a’-'z’中的一者取代單詞中的任一字元:如果字典比該詞的長度相等,比較兩者的區別,如果滿足條件,則輸出。
三、演算法實現
(主要程式碼)

資料結構:
struct word
{
    char w[N];
    int len;
};
struct word s[10001];  
演算法實現:
void Find(struct word T,int n)
{
    int i,f=1,j,cnt,t;
    for(i=0; i<n; i++)
    {
        if(strcmp(s[i].w,T.w)==0)
        {
            printf
("%s is correct\n",T.w); f=0; break; } } if(f) { printf("%s:",T.w); for(i=0; i<n; i++) { if(s[i].len==T.len+1) { j=t=cnt=0; for(; T.w[t]; j++,t++) {
if(T.w[t]!=s[i].w[j]) { t--; cnt++; } if(cnt>1) break; } if(cnt<=1) printf(" %s",s[i].w); } if(s[i].len==T.len-1) { j=t=cnt=0; for(; T.w[t]; j++,t++) { if(T.w[t]!=s[i].w[j]) { j--; cnt++; } if(cnt>1) break; } if(cnt<=1) printf(" %s",s[i].w); } if(s[i].len==T.len) { j=t=cnt=0; for(; T.w[t]; j++,t++) { if(T.w[t]!=s[i].w[j]) cnt++; if(cnt>1)break; } if(cnt<=1) printf(" %s",s[i].w); } } printf("\n"); } }

四、演算法分析
演算法分析:最壞情況,沒查到,對其進行逐個修改。約為O(N*M),
其中N為字典元素,M為待查詢單詞個數。
空間複雜度:O(1)
解決這個題目的關鍵在於,運用長度減小了時間,然後在比較時,用標記,然後計數,如果大於一則表明不是修改的的單詞。