單詞接龍的最短字串長度 DFS加剪枝

2021-10-04 05:41:56 字數 1141 閱讀 4272

前幾天又刷到一單詞接龍題,不一樣的是這次要求的是能接龍的最短字串長度,所謂能接龍的意思是最少有兩個單詞能夠接龍(即單詞一的尾字母與單詞二的首字母一樣),如果任意兩個單詞都無法接起來,輸出0。這個題用dfs做是比較簡單的,另外如果加些剪枝的話在大單詞量的時候效率將會提公升很多。

剪枝方法:首尾字母相同的單詞在最短結果中最多隻使用一次,因此對於首尾字母相同的單詞,只記錄最短單詞的長度即可,其它單詞可以扔掉。證明:假設最短結果存在兩個首尾字母相同的單詞  ...a->axb->bioyher->ra->ayyyb->b....那麼必然可以把從第乙個相同單詞後面那個單詞開始,到第二個相同單詞結束的一段拿掉,變成...a->axb->b....,因此得證。但是存在一種特殊情況,比如說有下面一組單詞: a  aa  word  god hello,顯然最優結果是a->aa,首尾字母相同的單詞出現了兩次,所以對於首尾字母相同的單詞,需要記錄最短的兩個單詞的長度。

**如下:

#include #define n 100

#define char_cnt 26

static int minstrlen = int32_max;

static int length[char_cnt][char_cnt];//下標0對應字母a,下標1對應字母b,依此類推,第一維代表首字母,第二維代表尾字母

static int special[char_cnt][2];

int getlen(char *str, char *b, char *e)

return i;

}void putword()

else

if (x == y)

else if (special[x][1] == 0 || special[x][1] > len)

} }}void dfs(int cur, int strlen, int wordcnt) }}

void checkspecial()

}int main()

checkspecial();

if(minstrlen==int32_max)

std::cout << 0;

else

std::cout << minstrlen;

return 0;

}

P1019 單詞接龍 DFS 字串

題目鏈結!題目描述 單詞接龍是乙個與我們經常玩的成語接龍相類似的遊戲,現在我們已知一組單詞,且給定乙個開頭的字母,要求出以這個字母開頭的最長的 龍 每個單詞都最多在 龍 中出現兩次 在兩個單詞相連時,其重合部分合為一部分,例如 beast和astonish,如果接成一條龍則變為beastonish,...

code1018 單詞接龍 dfs,字串處理

題目描述 description 單詞接龍是乙個與我們經常玩的成語接龍相類似的遊戲,現在我們已知一組單詞,且給定乙個開頭的字母,要求出以這個字母開頭的最長的 龍 每個單詞都最多在 龍 中出現兩次 在兩個單詞相連時,其重合部分合為一部分,例如beast和astonish,如果接成一條龍則變為beast...

洛谷 P1019 單詞接龍(dfs 字串)題解

題目描述 單詞接龍是乙個與我們經常玩的成語接龍相類似的遊戲,現在我們已知一組單詞,且給定乙個開頭的字母,要求出以這個字母開頭的最長的 龍 每個單詞都最多在 龍 現兩次 在兩個單詞相連時,其重合部分合為一部分,例如 beast和astonish,如果接成一條龍則變為beastonish,另外相鄰的兩部...