题目链接P1019
题目意思即为将可以连接的串连接起来去掉重复的字段放回最大的字符串长度即可(每个串可以用2次)
(1)我们如何判断两个串是否可以连接,并且如何将这两个串进行连接
(2)我们将串连接后,重复的字段我们该怎么去掉
解决1:判断是否可以连接我们只需要从我们的当前连接好的这个串的最后面去寻找,如果找到了字母与我们要连接的串的第一个字母相等的话,我们就记录下这个位置,然后从这个位置继续往后面匹配看是不是满足连接的要求,如何进行连接的话我们只需要用String 直接可以使用+进行字符串连接
解决2:我们不需要把重复的字段去掉,因为题目也没有要求我们要把串输出来,题目只需要我们输出长度即可,因此我们每次连接时记录下重复了多少个字符最后用总长度减掉重复的就是我们需要的串长了。
代码:
import java.util.*;
public class Main {
static int max = 0;
static int n = 0;
static String a[];
static int b[];
static String key;
static String y; // 当前串
static int is(String x,String y){ // 返回重复的数值 不重复即返回0
char x1[] = x.toCharArray();
char y1[] = y.toCharArray();
for(int i = x1.length-1;i >= 0;i--){
if(x1[i] == y1[0]){// 找到可能可以相连的位置
int k = i; // 记录下当前位置
for(int j = 0;j < y1.length;j++){// 计算重复了多少个字符
if(k == x1.length) // 匹配成功
return k-i;
if(x1[k] == y1[j])
k++;
else // 不匹配的话寻找下一个可能相连的位置
break;
}
}
}
return 0;
}
static void dfs(int t,String x){// x为当前串 t为已经重复的数值
if(max < x.length()-t)
max = x.length()-t;
for(int i = 0;i < n;i++){
if(b[i] == 2)
continue;
int ok = is(x,a[i]);
if(ok == 0) // 不可连接
continue;
b[i]++;
dfs(t+ok,x+a[i]);
b[i]--;
}
}
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
a = new String[n];
b = new int[n];
Arrays.fill(b,0);
for(int i = 0;i < n;i++)
a[i] = sc.next();
key = sc.next();
dfs(0,key);
System.out.println(max);
}
}