C# 用字母表中的所有字母替换字符的出现

C# 用字母表中的所有字母替换字符的出现,c#,C#,我和电脑对手玩了一个拼字游戏。如果在单词生成过程中在计算机机架中发现空白磁贴,则需要为字母表中的每个字母交换。下面是我目前解决这个问题的方法,但我想知道是否有更好更有效的方法来完成这个任务 if (str.Contains("*")) { char c = 'A'; String made = ""; while(c < 'Z')

我和电脑对手玩了一个拼字游戏。如果在单词生成过程中在计算机机架中发现空白磁贴,则需要为字母表中的每个字母交换。下面是我目前解决这个问题的方法,但我想知道是否有更好更有效的方法来完成这个任务

if (str.Contains("*"))
                {
                    char c = 'A';
                    String made = "";
                    while(c < 'Z')
                    {
                        made = str.ReplaceFirst("*", c.ToString());
                        if (!made.Contains("*"))
                        {
                            wordsMade.Add(made);
                            if (theGame.theTrie.Search(made) == Trie.SearchResults.Found)
                            {
                                validWords.Add(made);
                            }
                        }
                        else
                        {
                            char ch = 'A';
                            String made2 = "";
                            while (ch < 'Z')
                            {
                                made2 = made.ReplaceFirst("*", c.ToString());
                                wordsMade.Add(made2);
                                if (theGame.theTrie.Search(made2) == Trie.SearchResults.Found)
                                {
                                    validWords.Add(made2);
                                }
                                ch++;
                            }
                        }
                        c++;
                    }
if(str.Contains(“*”))
{
字符c='A';
字符串made=“”;
而(c<'Z')
{
made=str.ReplaceFirst(“*”,c.ToString());
如果(!make.Contains(“*”)
{
添加(制作);
if(theGame.theTrie.Search(made)=Trie.SearchResults.Found)
{
有效词语。添加(制造);
}
}
其他的
{
char ch='A';
字符串made2=“”;
while(ch<'Z')
{
made2=make.ReplaceFirst(“*”,c.ToString());
添加(made2);
if(theGame.theTrie.Search(made2)=Trie.SearchResults.Found)
{
有效字数。添加(made2);
}
ch++;
}
}
C++;
}

这里有很多重复的代码可以重构

此例程是重复的,可以放在单独的方法中:

wordsMade.Add(made2);
if (theGame.theTrie.Search(made2) == Trie.SearchResults.Found)
{
   validWords.Add(made2);
}
像这样的事情

void addWord(string newWordMade){
    wordsMade.Add(newWordMade);
    if (theGame.theTrie.Search(newWordMade) == Trie.SearchResults.Found)
    {
       validWords.Add(newWordMade);
    }
}
此循环构造也被复制:

char ch = 'A';
String made2 = "";
while (ch < 'Z')
{
   made2 = made.ReplaceFirst("*", c.ToString());
   wordsMade.Add(made2);
   if (theGame.theTrie.Search(made2) == Trie.SearchResults.Found)
   {
      validWords.Add(made2);
   }
   ch++;
}

这里有很多可以重构的重复代码

此例程是重复的,可以放在单独的方法中:

wordsMade.Add(made2);
if (theGame.theTrie.Search(made2) == Trie.SearchResults.Found)
{
   validWords.Add(made2);
}
像这样的事情

void addWord(string newWordMade){
    wordsMade.Add(newWordMade);
    if (theGame.theTrie.Search(newWordMade) == Trie.SearchResults.Found)
    {
       validWords.Add(newWordMade);
    }
}
此循环构造也被复制:

char ch = 'A';
String made2 = "";
while (ch < 'Z')
{
   made2 = made.ReplaceFirst("*", c.ToString());
   wordsMade.Add(made2);
   if (theGame.theTrie.Search(made2) == Trie.SearchResults.Found)
   {
      validWords.Add(made2);
   }
   ch++;
}

Adam说得对,代码可以进行重构,使其显著更小(事实上更小了很多),但从根本上说,您必须检查所有26*26的通配符组合。因此,虽然可以使代码在语法上更高效,但我认为您无法使其在算法上更高效。

Adam认为可以对代码进行重构,使其显著更小(事实上更小了很多),但从根本上说,您必须检查所有26*26的通配符组合。因此,虽然可以提高代码的语法效率,但我认为您无法提高代码的算法效率。

您需要提供有关“单词生成”的更多信息过程。例如,从您的代码中,看起来您正在修复空白磁贴(在生成的单词中)的位置。这是您打算做的事情吗?根据您的要求,对计算机拼字游戏对手进行编码可能非常具有挑战性。在这方面有很多工作。您可以阅读这篇题为“拼字游戏中的对手建模”是一个很好的总结:。这是一个典型的问题。您需要提供有关“单词生成”过程的更多信息。例如,从您的代码中,看起来您正在修复空白瓷砖的位置(在生成的单词中)。这是你打算做的事情吗?根据你的期望,为电脑拼字游戏对手编码可能非常具有挑战性。在这方面有很多工作。你可以阅读这篇题为“拼字游戏中的对手建模”的文章“一个很好的总结:。这是一个典型的问题。+1用于提高算法复杂性。你从来没有说过,这更多的是用于OP,但这只是676个组合。一个O(n^2)算法通常是不好的,但如果n永远不会超过26,我会说这可能不重要。+1用于提高算法的复杂性。你从来没有说过,这更适用于OP,但这只是676个组合。O(n^2)算法通常是不好的,但如果n永远不会超过26,我会说这可能不重要。