为了更好的阅读体检,可以查看我的算法学习网
在线评测链接:P1123
(第一题实际上是一个链表题,那个不方便制作题目,也没啥难度,这里不录入OJ了)
题目内容
塔子哥是一位喜欢挑战自己的年轻人,他最近在研究字符串的重组问题。他的研究对象是N个小写字母字符串,每个字符串最长只有8个字母。他想设计一个游戏,让自己和朋友们一起玩,看看谁能拼出更多不同的重组字符串。
他决定使用自己的研究成果,计算出所有可能的重组字符串数量。具体地说,他从 每个字符串中选出一个字母,拼成一个新的字符串,同时要求新的字符串不能有重复的字母 。
现在塔子哥想请你来玩一下这个游戏,请问你能拼出多少种不同的重组字符串?
输入描述
第一行输入整数为N
第二行到第N+1行输入N个字符串,全部由小写字母组成
2 ≤ N ≤ 6 2\leq N\leq 6 2≤N≤6
1 ≤ l e n ( 字符串 ) ≤ 8 1\leq len(字符串)\leq 8 1≤len(字符串)≤8
输出描述
输出一个整数,代表总共能组成多少个重组字符串
样例
输入
5
abca
acds
aca
vac
bba
输出
6
思路
用dfs解决,假设一共n个字符串,那么dfs(tar)表示我们现在选取第tar个字符串里的字符。
为了保证字符不同,我们开辟一个tong数组记录每个字符出现了几次。
为了保证结果字符串都不同,我们开辟一个hashmap存每个字符串有没有出现过(开set也可以)
代码
Java代码:
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class StringRebuild {
static String[] arr = new String[10];
static int n;//输入
static int ans = 0;//最终答案
static StringBuilder sb = new StringBuilder();//用于构建字符串
static Map<String, Boolean> mp = new HashMap<>();//存储新字符串
static int[] tong = new int[300];//存储字符出现次数
public static void dfs(int tar){//dfs
if(tar == n){//dfs终止条件
if(!mp.containsKey(sb.toString())) {//如果没出现字符串sb,就加入mp
ans++;
mp.put(sb.toString(), true);
}
return;
}
for(int i = 0; i < arr[tar].length(); i++){//循环字符串arr[tar]的每一个字符
int val = (int)arr[tar].charAt(i);
if(tong[val] == 0){//保证字符不一样
sb.append(arr[tar].charAt(i));//加入字符串
tong[val]++;//记录字符出现次数
dfs(tar + 1);//dfs
sb.deleteCharAt(tar);//dfs完就把该字符的贡献删除
tong[val]--;
}
}
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
n = in.nextInt();
for(int i = 0; i < n; i++)arr[i] = in.next();
dfs(0);
System.out.println(ans);
}
}
//3
//ab
//ca
//ccb
python代码
from collections import defaultdict
n = int(input())
arr = [list(input()) for i in range(n)]#输入
sb = []#用于构建字符串
tong = defaultdict(int)#存储字符出现次数
st = set()#存储新字符串
def dfs(tar):#dfs
if tar == n:#dfs终止条件
st.add("".join(sb))
return
for i in range(len(arr[tar])):#循环字符串arr[tar]的每一个字符
if tong[arr[tar][i]] == 0:#保证字符不一样
sb.append(arr[tar][i])#加入字符串
tong[arr[tar][i]] += 1#记录字符出现次数
dfs(tar + 1)
sb.pop()#dfs完就把该字符的贡献删除
tong[arr[tar][i]] -= 1
dfs(0)
print(len(st))
# 3
# ab
# ca
# ccb