[英]How to generate all possible words
我是編程新手(C#)。
該應用程序是一個“單詞生成器”。
我正在尋找的是一個 for 循環,它可以使用給定字符數組中的字符生成所有可能的單詞。
我有一個List<char> = { A,a,6,w,# }
(長度可能會有所不同)
我想用這個字符集生成所有可能的單詞(例如:4 個字母長度)。 此選項應生成5 characters & 4 letters = 5*5*5*5 = 625 words
。
All generated words should be every possible combination of the given letters only
注意:有些人可能會告訴我,我應該使用名為( 字符串/整數的排列)的解決方案,如果所需的單詞長度與給定的字符長度相同,則此方法似乎沒問題,但在我的情況下,我可能會給應用程序 100 個字符, 但我希望它生成所有可能的單詞 -> 4 個字母長度(例如:MaRk、M@rK、m4rK...)
您可以使用IEnumerable<String>
方法:
public IEnumerable<String> GenerateStrings (IEnumerable<char> characters, int length) {
if(length > 0) {
foreach(char c in characters) {
foreach(String suffix in GenerateStrings(characters,length-1)) {
yield return c+suffix;
}
}
} else {
yield return string.Empty;
}
}
使用csharp
結果(交互式C#shell):
csharp> Foo.GenerateStrings(new char[] {'A','a','6','w','#'},3)
{ "AAA", "AAa", "AA6", "AAw", "AA#", "AaA", "Aaa", "Aa6", "Aaw", "Aa#", "A6A", "A6a", "A66", "A6w", "A6#", "AwA", "Awa", "Aw6", "Aww", "Aw#", "A#A", "A#a", "A#6", "A#w", "A##", "aAA", "aAa", "aA6", "aAw", "aA#", "aaA", "aaa", "aa6", "aaw", "aa#", "a6A", "a6a", "a66", "a6w", "a6#", "awA", "awa", "aw6", "aww", "aw#", "a#A", "a#a", "a#6", "a#w", "a##", "6AA", "6Aa", "6A6", "6Aw", "6A#", "6aA", "6aa", "6a6", "6aw", "6a#", "66A", "66a", "666", "66w", "66#", "6wA", "6wa", "6w6", "6ww", "6w#", "6#A", "6#a", "6#6", "6#w", "6##", "wAA", "wAa", "wA6", "wAw", "wA#", "waA", "waa", "wa6", "waw", "wa#", "w6A", "w6a", "w66", "w6w", "w6#", "wwA", "wwa", "ww6", "www", "ww#", "w#A", "w#a", "w#6", "w#w", "w##", "#AA", "#Aa", "#A6", "#Aw", "#A#", "#aA", "#aa", "#a6", "#aw", "#a#", "#6A", "#6a", "#66", "#6w", "#6#", "#wA", "#wa", "#w6", "#ww", "#w#", "##A", "##a", "##6", "##w", "###" }
將方法與yield
語句一起使用的優點是它很懶:如果只需要五個這樣的字符串,則不會首先生成所有可能的字符串。
威廉·范·翁塞姆,謝謝! 這正是我一直在尋找的。 但我的問題聽起來沒什么不同。 我必須生成所有可能的字符串,而不需要從源數組中重復字符。 這是你的代碼,我修改了它:
public static IEnumerable<string> GenerateStrings(IEnumerable<char> characters, int length, int count)
{
if (length > 0)
{
foreach (char c in characters)
{
char[] charactersDec = new char[characters.Count()];
Array.Copy(characters.ToArray(), charactersDec, characters.Count());
int index = Array.IndexOf(charactersDec, c);
charactersDec = charactersDec.Where((val, idx) => idx != index).ToArray();
foreach (string suffix in GenerateStrings(charactersDec, length - 1, count++))
{
yield return c + suffix;
}
}
}
else
{
yield return string.Empty;
}
}
我從數組中刪除當前字符並將這個數組傳遞給遞歸調用。
a、b、c、d 的輸出將是:ab ba ac ca ad da bc cb bd db cd dc 請,對不起我的英語。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.