AcWing 1117. 单词接龙
这道题要学会的是用sub和k值找出字符串首尾相同部分的长度,还有就是用word数组记录所有单词,这样用的时候更方便,DFS的理解又加深了一层,继续加油
#include<bits/stdc++.h>
using namespace std;
const int N = 25;
int n;
string word[N];
int g[N][N]; //g[i][j]记录第i个单词结尾和第j个单词结尾最小的重复长度
int ans;
int used[N]; //记录第i个单词被用的次数
void dfs(string dra, int last){ //目前的龙和龙最后一个用的单词
ans = max(ans, (int)dra.size());
used[last] ++ ;
for(int i = 0; i < n; i ++ ){
if(g[last][i] && used[i] < 2){
dfs(dra + word[i].substr(g[last][i]), i);
}
}
used[last] -- ; //恢复现场
}
int main()
{
cin>>n;
for(int i = 0; i < n; i ++ ){
cin>>word[i];
}
char start;
cin>>start;
for(int i = 0; i < n; i ++ ){
for(int j = 0; j < n; j ++ ){
for(int k = 1; k < min(word[i].size(), word[j].size()); k ++ ){ //注意k要从1开始
if(word[i].substr(word[i].size() - k, k) == word[j].substr(0, k)){
g[i][j] = k;
break;
}
}
}
}
for(int i = 0; i < n; i ++ ){
if(word[i][0] == start){
dfs(word[i], i);
}
}
cout<<ans<<endl;
return 0;
}