总体思路:
首先将给定的开头字符(某个单词)依次和其他单词的首字母进行比较,找到相同的字母后标记并检索重复的字母
#include <iostream>
#include<string>
#include<stack>
using namespace std;
int n;
string a[25];//string类的数组
int b[25];//单词出现的次数
int ans,nom=1;//长度
void dfs(int x)
{
ans=max(ans,nom);
for(int i=1;i<=n;i++)//在输入的单词中查找
{
if(b[i]<2)
{
for(int j=0;j<a[x].length();j++)//将单词的首字母和选定单词的字母比较
{
if(a[i][0]==a[x][j])
{
int l1=j;
int l2=0;
while(a[i][l2]==a[x][l1]&&a[x].length()>l1)//
{//判断是否有重叠部分
l1++;
l2++;
}
if(l1>=a[x].length())
{
nom+=a[i].length()-l2;
b[i]++;
dfs(i);//
nom-=a[i].length()-l2;//在选定某个单词作为比较模型时,如果在其他单词中找不到可连接的单词,则回溯,重新找其他单词。
b[i]--;
}
}
}
}
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
cin>>a[0];
dfs(0);
cout<<ans<<endl;
return 0;
}