1

我正在为 C# 制作一个简单的拼写检查器,我想尝试将给定的答案与随机选择的单词进行比较。

我想将第一个字母与答案中给出的所有字母进行比较,这样我就可以判断它是否正确,是否存在字母交换、删除或添加的字母。我最终希望能够判断是否只有一个字母是错误的,才能看到使用了替换。

例如,正确回答你好:

    checking first letter ~H 
    h e l l o
    1 0 0 0 0

    h h e l l o
    1 1 0 0 0 0

    e l l o 
    0 0 0 0

然后检查第二个字母。

当涉及到 C# 时,我完全不知道。

我试过了

int CheckErrors(string Answer, string Guess)
        {
            if (Answer == Guess)
            {
                return 1;
            }

            if (Answer == null || Guess == null)
            {
                return -1;
            }

            for (int i = 0; i <= Answer.Length; i++)
            {

                if (Guess[i] != Answer[i])
                {
                    count++;

                    //substitution = -4
                    //deletion = -5
                    //transposition = -6
                    //insertion = -7
                }
                return count;
            }
            return -9;
        }

但我不能再进一步了。

更新:

通过进一步的研究,我想我想做的是:

STRING answer = answer_given
STRING input = correct_answer

int check = 0;

FOR (int i = 0; i < input.Length; i++)
{
   FOR (int ii = 0; ii < answer.Length; ii++)
   {
     if (input[i] == answer[i])
     {
        int check++;
     }
   }
}

显然我知道这会不断增加检查,但我猜不出还有什么办法。

另一个更新!

我可以用这个-

int CheckErrors(string Answer, string Guess)
        {
            int[,] d = new int[Answer.Length + 1, Guess.Length + 1];
            for (int i = 0; i <= Answer.Length; i++)
                d[i, 0] = i;
            for (int j = 0; j <= Guess.Length; j++)
                d[0, j] = j;
            for (int j = 1; j <= Guess.Length; j++)
                for (int i = 1; i <= Answer.Length; i++)
                    if (Answer[i - 1] == Guess[j - 1])
                        d[i, j] = d[i - 1, j - 1];  //no operation
                    else
                        d[i, j] = Math.Min(Math.Min(
                            d[i - 1, j] + 1,    //a deletion

                            d[i, j - 1] + 1),   //an insertion

                            d[i - 1, j - 1] + 1 //a substitution

                            );
            return d[Answer.Length, Guess.Length];
        }

但是我需要一种方法来计算每个错误的使用次数?

4

3 回答 3

1

您可以通过查看WikipediaStackOverflow中的 Approximate String Matching 获得灵感。

于 2013-03-21T23:57:09.367 回答
1

您的功能有几个问题:

  • 您正在尝试使用单个返回值来处理该值的含义不一致的多个场景。不建议函数同时返回状态(匹配、一个或两个值 null、不匹配等)和计数器。
  • 如果您打算使用数字来表示返回状态,请使用enum以使其更具可读性。
  • 您的for循环总是在一次迭代后终止,因为它每次都命中 return 语句。您的 return 语句需要在for循环之后移动。
  • if (Guess[i] != Answer[i])如果 i 大于Guess.
  • 不清楚count应该代表什么,也没有在函数中定义。

您需要更好地定义您的功能应该做什么。如果答案是“你好”并且猜测是“你好”,你要返回什么?不匹配的字母数 (1)?代表错误的代码(插入)?错误在哪里?如果你需要不止一个这些东西,那么你需要一个单独的函数。

于 2013-03-21T20:00:36.453 回答
0

您是否考虑过尝试 string.Compare(...)?

http://msdn.microsoft.com/en-us/library/zkcaxw5y.aspx

于 2013-03-21T19:49:55.430 回答