给出一串长度为'n'的字符串。如何获得长度为r的所有子序列(r <= n)。 我正在考虑使用动态编程来实现它,但无法提供一个好的解决方案。 我想要一个伪代码。
EG。给出字符串“abc”并且r = 2。
输出:ab BA AC CA 公元前 CB
提前致谢
答案 0 :(得分:3)
重要的是要看到所有可能的子串(连续序列)和通常子序列(不一定是连续的)之间的区别。
如果这是真的,那么你被问到的是combinations,并且首先要估计你给出字符串长度和子序列大小的数量。
递归算法是最好的方法:它允许您将子序列的长度作为变量。你会在another thread找到一个完美的答案。
答案 1 :(得分:1)
尝试以下代码(没有伪代码,但我希望可以理解):
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
string S;
int n;
vector<string> L;
void F(int index, int length, string str)
{
if (length == 0) {
L.push_back(str);
} else {
for (int i = index; i < n; i++) {
string temp = str;
temp += S[i];
F(i + 1, length - 1, temp);
}
}
}
int main()
{
S = "abcde"; // replace with your string
n = S.length();
int k = 3; // or what you want
F(0, k, string(""));
int count = 0;
for (int i = 0; i < int(L.size()); i++) {
string temp = L[i];
sort(temp.begin(), temp.end());
do {
cout << temp << endl;
count++;
} while (next_permutation(temp.begin(), temp.end()));
}
cout << endl << "count = " << count << endl;
return 0;
}
答案 2 :(得分:0)
public static void combinations(String suffix,String prefix){
if(prefix.length()<0)
return;
System.out.println(suffix);
for(int i=0;i<prefix.length();i++) {
combinations(suffix+prefix.charAt(i),prefix.substring(i+1,prefix.length()));
}
}
//call above function like: combinations("","abcd");
答案 3 :(得分:0)
使用递归->选择和不选择概念
您必须做出一个决定,就是要选择要添加到字符串中的元素还是不添加到字符串中。基于这种方法,我们有了此递归解决方案。
def subse(string,current,index,n):
if index == n:
print(current)
return;
else:
subse(string,current+string[index],index+1,n) #pick element and add it to output string that is current
subse(string,current,index+1,n) #don't pick
if __name__ == "__main__":
subse('abc','',0,3)