例如,我们得到长度为5(n=5)的字符串“Number”,它由从1到a的所有数字组成(数字可以重复,但从1到a的所有数字都必须包含在字符串中,并且字符串的长度必须为n)。假设a=2并使用先前给定的条件生成示例性数字(或者更确切地说是数字序列),假设它是长度为5并由1和2组成的“12211”。现在让我们假设我们需要找到一个算法,该算法将在我们的字符串“Number”中找到所有可能的数字序列,其中每个序列都是“Number”的子字符串,每个序列具有不同的长度,可能只包含任何数字的一次出现。
对于我们的示例“12211”,我们可以说有7个序列:
1. "1"
2. "12"
3. "2"
4. "2"
5. "21"
6. "1"
7. "1"
结果将是“7”。
另一个清晰的例子:对于“Number”=“123452”和b=5(数字为1,2,3,4,5)可能的序列是:
1. "12345"
2. "1234"
3. "123"
4. "12"
5. "1"
6. "2345"
7. "234"
8. "23"
9. "2"
10. "3452"
11. "345"
12. "34"
13. "3"
14. "452"
15. "45"
16. "4"
17. "52"
18. "5"
19. "2"
结果将是“19”。
你对快速算法有什么想法吗?我想出的那个太慢了(比较每个数字)。
int count(std::string seq, int len) {
int sum = 0;
bool elem[256] = {0};
int i = 0, j = 0;
while ( i < len ) {
while ( !elem[seq[j]] && j < len) {
elem[seq[j]] = true;
j++;
}
sum += j - i;
elem[seq[i]] = false;
i++;
}
return sum;
}
我想不出比这更有效的解决方案了。祝你好运
看看最长的常见子序列问题,查看“读取所有LCS”部分,并巧妙地使用矩阵,您将获得所需的所有内容。
将布尔表作为一个集合(在第n个元素中为true表示n在实际间隔中)
现在很简单。您应该遍历数组并扩展间隔,当您找到重复的元素时,您只需移动间隔的开始,直到您到达唯一序列。
一些更好解释的代码:
unsigned long long number_of_seq(string seq) {
set<char> in_use; //Can be some O(1) set, pointless
unsigned long long result = 0ULL;
//p - begin of actual interval
//q - end of this interval
for(size_t p = 0, q = 0; q < seq.size();) {
while(in_use.count(seq[q]) != 0) { //While: add seq[q] makes interval not unique
in_use.erase(seq[p]);
++p; //move begin of interval
}
in_use.insert(seq[q]);
++q;
result += q - p; //add size of interval
}
return result;
}
您应该添加任意间隔的大小,因为您只需在末尾添加新元素,所有子字符串都是正确的(没有两个相同的字符),并且所有没有新字符的子字符串都会被考虑。它是seq[0:q]和seq[q]中最大的唯一子串,所以它是正确的。
我认为这个问题可以用动态规划来解决,但我不能提出递归关系。
可能的子集:- 我只能想到一个朴素的算法,它列出集合的所有子集,并检查子集和是否>=k,但它是一个指数算法,列出所有子集需要O(2^n)。我能用动态规划在多项式时间内求解吗?
问题内容: 我正在尝试生成所有可能的长度N总计为S的列表。我已经编写了一些代码来这样做,但是在任何大的东西上(特别是我希望N = 5,S = 100),我都遇到了内存溢出错误。 我正在寻找一个更好的解决方案,或者一种方法来改进我的代码,以便可以在N = 5,S = 100上运行它。下面的这两个程序协同工作,以在嵌套列表中创建所有可能的数字组合,然后将它们重新加工为正确的格式。以下是一些示例输出。
问题内容: 我想以所有可能的组合将列表分为n个组(允许可变的组长)。 说,我有以下列表: 如果我指定n = 2,则列表可以分为1个element-3元素或2个element-2元素的组。在拆分列表的两种方式中,每个列表中都有哪些元素的独特组合。 在n = 2的情况下,它们将是: 当n = 1时,这些将是: 在n = 3的情况下,它们将是: 我对长度为0的组不感兴趣,并且组内的顺序无关紧要。 我发现
我试图从表示数字的int数组生成所有可能的数字。 例如,我得到以下结果。 例如,arr=new int[]{1,2,3},我得到以下结果。 1 2 3 11 21 31 12 22 32 13 23 33 111 211 311 121 221 321 131 231 331 112 212 312 122 222 322 132 232 332 113 213 313 123 223 323 1
本文向大家介绍PHP实现给定一列字符,生成指定长度的所有可能组合示例,包括了PHP实现给定一列字符,生成指定长度的所有可能组合示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP实现给定一列字符,生成指定长度的所有可能组合。分享给大家供大家参考,具体如下: 给定一列字符,生成指定长度的所有可能的组合: 如:a,b,c,d,e 或 0-9 生成长度 1:a, b, c, d, e;