我需要编写一个函数来查找字符串可能的固定长度组合。需要的是并非所有的组合都是必需的。例如,如果字符串是“abcde”,并且我们需要长度为3的组合,那么该函数必须返回以下内容:
abc
abd
abe
acd
ace
ade
bcd
bde
bce
cde
,没有别的。我一直在尝试使用递归,但事情并没有像预期的那样成功。我也看到了一些类似的问题,但无法从中得到很多。算法或代码(C,C ++,Java),欢迎任何帮助。谢谢!
注意:需要订购组合。也就是说,字符应遵循与输入字符串中相同的顺序。
答案 0 :(得分:3)
在有三个输入的情况下,您有三个索引,最初设置为输入字符串的前三个索引。打印出来,然后将最后一个索引加1,并打印出所有索引。继续,直到到达输入字符串的末尾,然后增加第二个索引,并在第二个索引之后将第三个索引重置为下一个索引。继续,直到第二个索引是倒数第二个字符,然后增加第一个索引,并在第一个索引之后按顺序放置第二个和第三个索引。继续...
让我试着说明一下:
Input: [abcde] ^^^ 123 Output: abc Next iteration: Input: [abcde] ^^ ^ 12 3 Output: abd Next iteration: Input: [abcde] ^^ ^ 12 3 Output: abe Next iteration: Input: [abcde] ^ ^^ 1 23 Output: acd Next iteration: Input: [abcde] ^ ^ ^ 1 2 3 Output: ace Next iteration: Input: [abcde] ^^^ 123 Output: bcd Next iteration: Input: [abcde] ^^ ^ 12 3 Output: bce Next iteration: Input: [abcde] ^ ^^ 1 23 Output: bde Next iteration: Input: [abcde] ^^^ 123 Output: cde
答案 1 :(得分:0)
由于您的要求长度为3,因此将String
拆分为3块,然后应用算法。
将String
3中的一个字符放在一边,并计算其余2个字符的可能排列。
将一个字符放在计算排列的所有可能位置上。
重复上述步骤。
答案 2 :(得分:0)
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
int main()
{
char buf[6] = "abcde";
int len = strlen(buf);
// std::vector<std::string> char_list;
for(int i = 0; i < len; ++i){
for(int j = i+1; j < len;++j){
//if (i==j)continue;
for(int k = j+1; k < len;++k){
//if(i == k || j == k)
// continue;
char temp[4]="";
temp[0] = buf[i];
temp[1] = buf[j];
temp[2] = buf[k];
temp[3] = '\0';
std::cout << temp << std::endl;
//show(temp,3);
//char_list.push_back(key);
}
}
}
return 0;
}
答案 3 :(得分:0)
我希望它可以做得更好,但这是我能够快速提出来的。
我使用List
来保存订单,并且不得不避免重复。使用Set
代替我们可以跳过result.contains(s)
检查,但更好的算法可能会更清晰地避免重复。
private static List<String> substrings(int i, String input) {
List<String> result = new ArrayList<String>();
if (i == 0)
return result;
String first = input.substring(0, i);
result.add(first);
if (input.length() == i) {
return result;
}
// Recursively find substrings of next smaller length not including the first character
List<String> tails = substrings(i-1, input.substring(1));
// Append first char to each result of the recursive call.
for (String sub: tails) {
String s = input.substring(0, 1) + sub;
if (!(result.contains(s)))
result.add(s);
}
// Add all substring of current length not including first character
result.addAll(substrings(i, input.substring(1)));
return result;
}