我想输出所有相似数字的数字,其中:
例如,假设我给出了一个数字12314,那么我有12,23,31,14对
我应该生成[12314,31231,12312,23123]
。
如果我给出了52或11111这样的数字,那么我应该只得到52/11111。
我已经编写了生成对[12,23,31,14]
的代码,并生成了这个对列表的所有可能的排列。但是,排列会产生比原始数字更长的数字,并且这些排列中的许多都是无效的。例如,当排列中出现1214
时,排列无效,因为" 21"不在原始号码中。
我想知道如何继续。从所有排列中筛选出无效的方法看起来效率很低。
答案 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);
您可以通过使对成为邻接列表而不是邻接矩阵来优化代码。