前幾天又刷到一單詞接龍題,不一樣的是這次要求的是能接龍的最短字串長度,所謂能接龍的意思是最少有兩個單詞能夠接龍(即單詞一的尾字母與單詞二的首字母一樣),如果任意兩個單詞都無法接起來,輸出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,另外相鄰的兩部...