生成数字,其中每对相邻数字也出现在原始数字中

时间:2016-10-02 01:56:36

标签: algorithm permutation

我想输出所有相似数字的数字,其中:

  1. 每对相邻的数字也出现在原始数字中。
  2. 新号码与原始号码的位数相同。
  3. 生成数字的顺序并不重要
  4. 例如,假设我给出了一个数字12314,那么我有12,23,31,14对

    我应该生成[12314,31231,12312,23123]

    如果我给出了52或11111这样的数字,那么我应该只得到52/11111。

    我已经编写了生成对[12,23,31,14]的代码,并生成了这个对列表的所有可能的排列。但是,排列会产生比原始数字更长的数字,并且这些排列中的许多都是无效的。例如,当排列中出现1214时,排列无效,因为" 21"不在原始号码中。

    我想知道如何继续。从所有排列中筛选出无效的方法看起来效率很低。

1 个答案:

答案 0 :(得分:0)

您可以使用递归来生成所需的数字。

我们的想法是在任何阶段只保留有效数字,并在数字的原始长度和长度相等时显示。

// pairs[i][j] is true if j is immediately after i in the original number
bool pairs[10][10];

// curr_num is a valid number according to the constraint given
// curr_len is the number of digits in curr_num
// length is the number of digits in the number given
void generate(int curr_num, int curr_len, int length){
    if(cur_len == length){
         display curr_num;
     } else {
        // extract last digit & check what digits can follow that
        int last = curr_num % 10;
        for(int i = 0 ; i <= 9 ; i++)
            if(pairs[last][i])
                generate(curr_num * 10 + i , curr_len + 1, length); 
    }
}

for(digit in original_number)
    generate(digit, 1, length);

您可以通过使成为邻接列表而不是邻接矩阵来优化代码。