C#程序通过添加'找不到可以通过单词生成的单词。 '在人物之间?

时间:2010-11-03 13:13:19

标签: c# .net visual-studio-2008 algorithm

我在聊天室里问过这个问题。但没有答案,所以我在这里发布问题。

问题是,例如采用abcd这个词

它有4个字符。通过添加'。 '在字母之间你可以把它写成a.b.c.d

规则
字符之间只能使用1个点 可以在单词中使用多个点 编辑:可以有没有'的字符。在他们之间。例如(ab或abcd)
不能在单词的开头或结尾使用点,即.abcd或abcd。是假的

一些答案​​
A.B.C.D
a.bcd
ab.cd
abc.d
a.b.cd
a.bc.d
ab.c.d
abc.d

可以制作多少个单词。如何编写程序在c#中找到它?

修改 如何显示每个可能的单词?

4 个答案:

答案 0 :(得分:8)

你真的不需要为此编写程序。

对于n个字符的单词,有n-1个位置,其中可以有一个点(即每对字符之间)。每个位置都有一个点或没有。

因此有2个 n-1 可能的单词。

如果确实想要编写一个C#程序来显示它:

using System;

class Test
{
    static void Main(string[] args)
    {
        // Argument validation left as an exercise for the reader
        string word = args[0];
        Console.WriteLine("Word {0} has {1} possibilities",
                          word, Math.Pow(2, word.Length - 1));
    }
}

编辑:请注意,这假设原始单词(没有点)仍然有效。如果您不想计算,请从结果中减去一个。

编辑:我已将计算更改为使用Math.Pow,以便:

  • 它处理超过33个字母的字词(当然是另一个限制)
  • 更清楚

答案 1 :(得分:3)

你可以递归地做。

(abcd)的所有可能组合是:

a + . + all combinations of (bcd)
ab + . + all combinations of (cd)
abc + . + all combinations of (d)
abcd

代码:

public static IEnumerable<string> GetCombinations(string str) {
  for (int i = 1; i < str.Length; i++) {
    foreach (string s in GetCombinations(str.Substring(i))) {
      yield return str.Substring(0, i) + "." + s;
    }
  }
  yield return str;
}

用法:

foreach (string s in GetCombinations("abcd")) Console.WriteLine(s);

答案 2 :(得分:2)

组合数量:

string s = "abcd";
int len = s.Length;
int combinations = 1 << (len - 1);

编辑:保罗在评论中指出,

int combinations = 1 << (len - 1) - 1;

如果不是有效组合,则删除不包含点的单词。

答案 3 :(得分:0)

为什么需要一个程序?

如果字符串的长度为n,则可以放置n-1个地方。

在任何地方,都可以有一个。或不,即两个选项。

所以答案是2 **(n-1) - 1(-1代表没有点的答案,即原始单词)