單詞檢查(Ⅰ)- 順序表實現
阿新 • • 發佈:2020-12-15
一、題目
如果輸入檔案中有詞vake ,檢查程式就能發現其是一個錯誤的單詞,並且給出 bake, cake或vase做為修改建議單詞。
修改建議單詞可以採用如下生成技術:
(1)在每一個可能位置插入‘a-‘z’中的一者
(2)刪除單詞中的一個字元
(3)用‘a’-'z’中的一者取代單詞中的任一字元
二、分析
首先存入詞典。然後查詢,如果查到則over。沒查到,進入修改系統。
(1)在每一個可能位置插入‘a-‘z’中的一者,如果字典比該詞的長度大一,比較兩者的區別,如果滿足條件,則輸出。
(2)刪除單詞中的一個字元:如果字典比該詞的長度小一,比較兩者的區別,如果滿足條件,則輸出。
三、演算法實現
(主要程式碼)
資料結構:
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)
解決這個題目的關鍵在於,運用長度減小了時間,然後在比較時,用標記,然後計數,如果大於一則表明不是修改的的單詞。