字符串的有序固定长度组合
Ordered Fixed Length Combinations of a String
我需要编写一个函数来查找字符串的可能固定长度组合。需要的是并非所有的组合都是必需的。例如,如果字符串是"abcde",并且我们需要长度为3的组合,那么函数必须返回以下内容:
abc
abd
abe
acd
ace
ade
bcd
bde
bce
cde
没有其他。我一直在尝试使用递归,但结果并不像预期的那样。我也看到了一些类似的问题,但无法从中得到太多。算法或代码(C、C++、Java),欢迎任何帮助。谢谢
注意:这些组合需要订购。也就是说,字符应该遵循与输入字符串中相同的顺序。
在有三个输入的情况下,您有三个索引,最初设置为输入字符串的前三个索引。打印出来,然后将最后一个索引增加一,然后打印出所有索引。继续,直到到达输入字符串的末尾,然后增加第二个索引,并将第三个索引重置为第二个之后的下一个索引。继续,直到第二个索引是倒数第二个字符,然后增加第一个索引,并将第二个和第三个按连续顺序放在第一个之后。持续
让我来举例说明:
输入:[abcde]^^^123输出:abc下一次迭代:输入:[abcde]^^^12 3输出:abd下一次迭代:输入:[abcde]^^^12 3输出:abe下一次迭代:输入:[abcde]^^^1 23输出:acd下一次迭代:输入:[abcde]^^^1 2 3输出:ace下一次迭代:输入:[abcde]^^^123输出:bcd下一次迭代:输入:[abcde]^^^12 3输出:bce下一次迭代:输入:[abcde]^^^1 23输出:bde下一次迭代:输入:[abcde]^^^123输出:cde
我希望有可能做得更好,但这是我可以很快想到的。
我使用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;
}
-
由于您的需求是特定长度的3,请将
String
拆分为3块,然后应用算法。 -
从
String
(共3个)中留出一个字符,并计算剩余2个字符的可能排列。 -
将这一个字符放在计算出的排列的所有可能位置上。
-
重复上述步骤。
#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] = ' ';
std::cout << temp << std::endl;
//show(temp,3);
//char_list.push_back(key);
}
}
}
return 0;
}
相关文章:
- 组合字符串不适用于 libCurl,C++
- 如何组合一个宽字符字符串,中间插入一些空字符
- 从给定字符串中查找长度 k 的所有排列/组合
- 通过字符串迭代并将每个循环中的先前字符组合在一起
- 从左到右打印字符串的组合(不是排列)c++
- 在不使用递归的情况下求解所有 2D 字符串向量组合?(C++)
- 字符串向量的有效组合
- 将字符串转换为带有Isringstream的字符和INT(组合)
- Clang-Format:重新组合字符串文字
- 字符串二进制组合学
- 如何在 if/else 语句中组合字符串C++
- 我在 c++ 中组合了两个字符串,但放错了
- C Fstream字符串组合错误
- 如何使用for_each,transform,Iterator和lambda的某种组合将STD ::集合的字符串转换为小
- 在C++编程语言中,如何用n个向量长度的所有可能的字符串组合来填充向量
- 从字符串转换时,如何组合多个枚举
- C++组合两个以零结尾的字符串
- "无法封送'返回值':无效的托管/非托管类型组合",同时使用字符串数组封送委托
- 组合字符串 C++ 的映射和数组
- 如何组合C++字符串和Arduino字符串