这个问题很笼统,但我将举一个具体的例子。

here说明了需要解决的特定问题。描述很长,所以我不会剪切和粘贴,但是基本思想是输入字符串S和T(在下面的代码中将它们称为),找到为产生T而需要对S进行的最小更改数量。一种更改可以是:

  • 在字符串的任何结尾插入一个字母。
  • 从字符串的任何结尾删除一个字母。
  • 将一个字母更改为其他任何字母。

  • 以下是我尝试跟踪的解决方案。我正在寻找的是如何最好地解决该问题的技巧。我可以使用哪些方法来阅读和理解代码(让我们逐步跳过调试器)。
    #include<iostream>
    #include<cstring>
    #include<stdio.h>
    using namespace std;
    char S[2010];
    char T[2010];
    int lens,lent;
    int main()
    {
        int i,j,ma,p;
    
        while(scanf("%s%s",S,T)!=EOF)
        {
            lens=strlen(S);
            lent=strlen(T);
            ma=0;p=0;
            for(i=0;i<lens;i++)
            {
                p=0;
                for(j=0;j<lent;j++)
                {
                    if(i+j>=lens)
                        break;
                    if(S[i+j]==T[j]){p++;}
                }
                if(ma<p)
                    ma=p;
                if(ma==lent)
                    break;
            }
            for(i=0;i<lent;i++)
            {
                p=0;
                for(j=0;j<lens;j++)
                {
                    if(i+j>=lent)
                        break;
                    if(T[i+j]==S[j]){p++;}
                }
                if(ma<p)
                    ma=p;
                if(ma==lent)
                    break;
            }
            printf("%d\n",lent-ma);
        }
        return 0;
    }
    

    最佳答案

    步骤1:向自己解释变量代表什么:
    S:我们要从中提取子字符串的字符串
    T:在使用尽可能少的操作修改提取的子字符串之后,最终要获得的字符串
    lens:字符串S的长度
    lent:字符串T的长度
    i:S中的索引,从中开始提取子字符串
    j:我们要与子字符串中的相应字符匹配的字符在字符串T中的索引
    p:为当前调查的子字符串找到的匹配字符数
    ma:任何子字符串的最大匹配字符数

    步骤2:确定了这些含义之后,将第一个循环翻译成单词相当简单:

    for loop 1 :    selects a start position of the substring
    
        set the match counter to 0, since we start investigation of a new substring
    
    
        for loop 2 :    loops through the substring
    
            if 1 :      if there is no char left to read string S, stop looping
    
            if 2 :      if the current character in the extracted substring matches
                    a character in the "goal" string, increment the match counter (p)
    
    
        if 3 :      now, we finished looping through a substring,
                if the count of matching characters in the substring and the goal
                string was higher than for any of the previous counts,
                then store this value as the max count
    
        if 4 :      if the max count of matching characters is equal to the
                length of the "goal string", dr Moriatry can receive the goal string
                with 0 substring changes, and hence, we can stop looping
    

    下一个循环是相似的。 S和T的作用已经颠倒了。但是请注意,S和T的角色尚未完全颠倒(正如某些人所说的那样)。在两种情况下,外部for循环的结束条件都使用T的长度,这是有道理的。

    在这里,我们从字符串T(“目标”字符串)中提取子字符串,并尝试将它们与字符串S进行匹配。为什么要这样做?

    我希望编写代码的人想解释以下情况,例如:
    S = "b"     T = "abc"
    

    如果我们仅从S提取子字符串并将其与整个T字符串匹配,并从第一个索引开始(就像第一个循环一样),我们只会比较“b(在S中)与a是否匹配(在第一个字符中T),然后继续说:“由于没有子字符串匹配,我们需要3个字符串更改操作来接收字符串T”(这显然是错误的,因为我们可以通过选择“b”作为要提取的子字符串来实现) ,并进行2次更改操作以T结束)

    10-01 06:29