题目类型:字符串,子串,DFS
题目来源:https://www.luogu.org/problemnew/show/P1019
思路:DFS部分并不难,主要是判断两个字符串是否可以接龙,从哪里开始接的问题。
另外在DFS的过程中,要实时比较当前接龙的长度与保存的最大长度进行比较,更新
代码:
//
// Created by Leo Lee on 2019/6/14.
//
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int N;
int longest;
string strarr[25];
int recode[25];
int ifBothHave(const string &s1,const string &s2);//判断是否可以接龙
void DFS(string s1,int L);
int main(){
cin>>N;
for(int i = 0;i<N+1;i++){
cin>>strarr[i];
}
for(int i = 0;i<N;i++){
if(strarr[i][0] == strarr[N][0]){
recode[i]++;
DFS(strarr[i],strarr[i].size());
recode[i]--;
}
}
cout<<longest;
return 0;
}
void DFS(string s1,int L){
for(int i = 0;i<N;i++){
if(recode[i]>=2) continue;
int index = ifBothHave(s1,strarr[i]);
if(index>0){
recode[i]++;
if(L+strarr[i].size()-index > longest){
longest = L+strarr[i].size()-index;
}
DFS(s1+strarr[i].substr(index),L+strarr[i].size()-index);
recode[i]--;
}else{
if(L>longest)
longest = L;
}
}
}
int ifBothHave(const string &s1,const string &s2){//判断是否可以接龙
int index = -1;
int its1,its2;
for(its1 = s1.size()-1,its2 = 1;its1>=0&&its2<=s2.size();its1--,its2++){
if(s1.substr(its1,s1.size()) == s2.substr(0,its2)){
index = its2;
if(its1 == 0 || its2 == s2.size() ) //出现包含
return -1;
else
return index;//立马返回,这样可以保证连接起来长度最长
}
}
return index;
}