给定N个字符串,每个字符串全部由小写字母组成,且每个字符串的长度最多为8,请你判断有多少重组字符串,重组字符串有以下规则: 1.从每个字符串里面都抽取1个字母组成 2.新字符串不能有2个相同的字母 请问总共能组成多少个重组字符串的C++代码
时间: 2023-05-29 10:07:10 浏览: 70
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 50;
int n, cnt;
int vis[26];
string s[MAXN];
void dfs(int pos, int mask) {
if (pos == n) {
cnt++;
return;
}
for (int i = 0; i < s[pos].length(); i++) {
int c = s[pos][i] - 'a';
if ((mask & (1 << c)) == 0) {
dfs(pos + 1, mask | (1 << c));
}
}
}
int main() {
cin >> n;
for (int i = 0; i < n; i++) {
cin >> s[i];
sort(s[i].begin(), s[i].end());
s[i].erase(unique(s[i].begin(), s[i].end()), s[i].end());
}
dfs(0, 0);
cout << cnt << endl;
return 0;
}
相关问题
给定N个字符串,每个字符串全部由小写字母组成,且每个字符串的长度最多为8,请你判断有多少重组字符串
两两可以重组成相同的字符串。
解题思路:
对于每个字符串,将其按照字母顺序排序,然后将排序后的字符串作为 key,原始字符串作为 value 存入一个哈希表中。最后统计哈希表中 value 的个数即可。
Python 代码:
n = int(input())
d = {}
for i in range(n):
s = input().strip()
key = ''.join(sorted(s))
if key not in d:
d[key] = set()
d[key].add(s)
print(sum(len(v) > 1 for v in d.values()))
给定N个字符串,每个字符串全部由小写字母组成,且每个字符串的长度最多为8请你判断有多少重组字符串,重组字符串有以下规则: 1.从每个字符串里面都抽取1个字母组成 2.新字符串不能有2个相同的字母请问总共能组成多少个重组字符串
思路:
由于每个字符串的长度最多为8,因此可以考虑枚举每个字符串中的每个字符,统计每个字符出现的次数。然后将每个字符的出现次数相乘,就是该字符能够组成的重组字符串的数量。最后将所有字符能够组成的重组字符串的数量相乘,就是总共能够组成的重组字符串的数量。
代码实现:
可以使用一个长度为26的数组count来统计每个字符出现的次数,count[i]表示字符i+'a'出现的次数。然后遍历所有字符串,统计每个字符的出现次数。最后再遍历一次count数组,计算每个字符能够组成的重组字符串的数量,并将所有字符的重组字符串的数量相乘即可。
C++代码:
阅读全文