这个问题很笼统,但我将举一个具体的例子。
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结束)