如何找到所有不同的组合作为字符串的不同长度的单位

时间:2011-08-09 11:47:16

标签: c# java c++ algorithm

您好我想找到所有不同的组合而不是给定字符串中的字符的线性选择,而不会丢失序列作为不同大小的单位。例如:

让我们说一句“HAVING”

然后它可以有像(空格分隔各个单位)的组合。

HA VI N G
HAV ING
H AV I N G
HAVIN G
H AVING
H AVIN G
HA VING
H AVI NG

....

像这样不同长度的单位的所有不同选择。

有人可以提供原型代码或算法。

谢谢, Kalyana

6 个答案:

答案 0 :(得分:4)

在一个大小为 n 的字符串中,您有 n-1 个位置,您可以在这些位置放置空格(=每对连续字母之间)。因此,您有2^(n-1)个选项,每个选项都由带有 n-1 位的二进制数表示,例如,您的第一个示例是01011

这应该给你足够的信息来开始(没有完整的解决方案;这听起来像家庭作业)。

答案 1 :(得分:1)

简单的递归解决方案。两组是第一个字母和其余部分。找到其余单词的所有组合。然后将第二个字母与第一个字母放在一起,并在其余单词上找到所有组合。重复,直到单词的其余部分为1个字母。

答案 2 :(得分:0)

这只是一个电源组不是吗?对于字符串中两个字母之间的每个位置,您有或没有空格。因此,对于长度为6的字符串,有5种可能性的2。

一个简单的递归函数将枚举所有可能性。你需要帮助编写这样的函数,还是只是在寻找算法?

答案 3 :(得分:0)

在每个字母之间,有一个分隔符或没有。因此,递归地查看单词,尝试分隔符/无分隔符的所有组合。

function f( word )
    set = word[0] + f( substring(word, 1) )
    set += word[0] + " " + f( substring(word, 1) )
    return set;

答案 4 :(得分:0)

我的解决方案
使它像

void func(string s)
{  
  int len=s.length();
  if(len==0)
  return;
  for(int i=1;i<=len;i++)
  {
    for(int j=0;j<i;j++)
    cout<<s[j];
    cout<<" ";
    func(s[i]);
  }
  return;
}

答案 5 :(得分:0)

递归。在java中:

public static List<List<String>> split (String str) {
    List<List<String>> res = new ArrayList<List<String>>();
    if (str == null) {
        return res;
    }
    for (int i = 0; i < str.length() - 1; i++) {
        for (List<String> list : split(str.substring(i + 1))) {
            List<String> tmpList = new ArrayList<String>();
            tmpList.add(str.substring(0, i + 1));
            for (String s : list) {
                tmpList.add(s);
            }
            res.add(tmpList);
        }
    }
    List<String> tmpList = new ArrayList<String>();
    tmpList.add(str);
    res.add(tmpList);
    return res;
}

public static void main(String[] args) {
    for (List<String> intermed : split("HAVING")) {
        for (String str : intermed) {
            System.out.print(str);
            System.out.print(" ");
        }
        System.out.println();
    }
}