这道单词拼写真的是很好的搜索题目
还是用DFS进行搜索,用vis[i]表示是否用过,然后进行查找
首先从给定的头开始进行dfs然后进行遍历每个单词
1看这个单词是否用过
2看这个单词是否可以连接上
然后需要暴力一遍长度判断是否可以连接
可以的话就进行连接,然后继续深搜下去
否则话就回溯回来
这里用string类进行加和操作很方便
写判断函数就用我现在连接的这个函数最后k位置去比较如果可以就连接否则就不连接
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
string word[25];
string beging;
int ans;
int vis[1000];
int n;
int add(string &a,string b,int k){
int lenb=b.length();
for (int i=k;i<lenb;i++){
a+=b[i];
}
}
int check(string a,string b,int k)
{
int lena=a.length();
for (int i=0; i<k; i++)
{
if (a[i+lena-k]!=b[i])
{
return 0;
}
}
return 1;
}
void dfs(string a)
{
int len=a.length();
ans=max(len,ans);
for (int i=1; i<=n; i++)
{
if (vis[i]>=2)
{
continue;
}
else
{
int len2=word[i].length();
for (int j=1; j<=len2; j++)
{
if (check(a,word[i],j))
{
string temp=a;
add(temp,word[i],j);
if (temp==a)
continue;
vis[i]++;
dfs(temp);
vis[i]--;
}
}
}
}
}
int main()
{
ans=0;
scanf("%d",&n);
memset(vis,0,sizeof(vis));
for (int i=1; i<=n; i++)
{
cin>>word[i];
}
cin>>beging;
dfs(beging);
cout<<ans<<endl;
return 0;
}