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

Posted

技术标签:

【中文标题】如何将所有不同的组合作为字符串字符的不同长度的单位【英文标题】:How to find all the different combinations as units of different lengths of the characters of a string 【发布时间】:2011-08-09 11:47:16 【问题描述】:

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

让我们说一个词“有”

然后它可以有像(分隔单个单元的空格)这样的组合。

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

....

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

谁能给出原型代码或算法想法。

谢谢, 卡利亚娜

【问题讨论】:

既然你在 c#、java 或 c++ 中要求它,让我给你一个简单的通用算法:String target = "H A V ING"; if (target.removeAllSpacesEverywhereInTheString() == "HAVING") // This is the one ! else // Nope 当然你必须实现 removeAllSpacesEverywhereInTheString 或找到执行类似操作的库函数以您选择的特定语言显示。 @arunkumar in C# String.Replace(" ", ""); @Jim 下面的答案似乎比我们的 String.Replace && 复杂得多,你不觉得吗? 【参考方案1】:

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

这应该为您提供了足够的信息以开始使用(没有完整的解决方案;这听起来像是家庭作业)。

【讨论】:

感谢您的解决方案。实际上它不是功课,在此之后它变得复杂。现在我需要这个词是否有不同的排列。而且我需要生成的每个单独计数的计数,并且它需要在分布式系统中运行。这就是我面临的实际问题。很抱歉,我忘了提及分布式算法要求。 @user716843:那么,你到底卡在哪里了? (也许值得开始一个新问题,同时详细说明您的分布式需求?) 我可以得到单独的组合。但是在 map reduce 设计中,当一个文件有很多单独的字符串应用时,处理器将整个事情分解为子集和单个可能单元的计数。问题是当我在本机 Hadoop 中编程时,它可以完成,但是当我使用 java 代码时,为了提高效率和其他子字符串计算,reduce 步骤失败了。实际问题是计算字符串中单词的组合。为了简单起见,我把它变成了一个单词。但是,我将开始一个新问题。顺便说一句,非常感谢:)【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

在每个字母之间,要么有分隔符,要么没有。所以递归地遍历单词,尝试所有分隔符/无分隔符的组合。

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

【讨论】:

【参考方案5】:

我的解决方案 让它像

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;

【讨论】:

【参考方案6】:

递归。在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();
    

【讨论】:

以上是关于如何将所有不同的组合作为字符串字符的不同长度的单位的主要内容,如果未能解决你的问题,请参考以下文章

生成不同字符串的非递归组合算法

屏蔽除字符串的前 6 位和后 4 位之外的所有数字(长度不同)

获取数组中所有可能的字符组合

将一对多字符串结果作为组合查询中的列

Counting

xcode将不同的最大字符长度设置为不同的TextField