当前位置: 首页 > 知识库问答 >
问题:

给定条件下N个长度内的所有可能序列

桓高澹
2023-03-14

例如,我们得到长度为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”。

你对快速算法有什么想法吗?我想出的那个太慢了(比较每个数字)。

共有3个答案

沈自珍
2023-03-14
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;
}

我想不出比这更有效的解决方案了。祝你好运

鲜于承基
2023-03-14

看看最长的常见子序列问题,查看“读取所有LCS”部分,并巧妙地使用矩阵,您将获得所需的所有内容。

习旻
2023-03-14

将布尔表作为一个集合(在第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;