我在聊天室里问过这个问题。但没有答案,所以我在这里发布问题。
问题是,例如采用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#中找到它?
修改 如何显示每个可能的单词?
答案 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
,以便:
答案 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代表没有点的答案,即原始单词)