长度为n的字符串的所有子序列

时间:2011-12-11 19:38:44

标签: algorithm

给出一串长度为'n'的字符串。如何获得长度为r的所有子序列(r <= n)。 我正在考虑使用动态编程来实现它,但无法提供一个好的解决方案。  我想要一个伪代码。

EG。给出字符串“abc”并且r = 2。

输出:ab          BA          AC          CA          公元前          CB

提前致谢

4 个答案:

答案 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)