【备战秋招】每日一题:2023.03.26-实习-腾讯笔试题(第二题)-重组字符串

为了更好的阅读体检,可以查看我的算法学习网
在线评测链接:P1123

(第一题实际上是一个链表题,那个不方便制作题目,也没啥难度,这里不录入OJ了)

题目内容

塔子哥是一位喜欢挑战自己的年轻人,他最近在研究字符串的重组问题。他的研究对象是N个小写字母字符串,每个字符串最长只有8个字母。他想设计一个游戏,让自己和朋友们一起玩,看看谁能拼出更多不同的重组字符串。

他决定使用自己的研究成果,计算出所有可能的重组字符串数量。具体地说,他从 每个字符串中选出一个字母,拼成一个新的字符串,同时要求新的字符串不能有重复的字母

现在塔子哥想请你来玩一下这个游戏,请问你能拼出多少种不同的重组字符串?

输入描述

第一行输入整数为N

第二行到第N+1行输入N个字符串,全部由小写字母组成

2 ≤ N ≤ 6 2\leq N\leq 6 2N6

1 ≤ l e n ( 字符串 ) ≤ 8 1\leq len(字符串)\leq 8 1len(字符串)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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

塔子哥学算法

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值