问题是这样的。
更改用户提供的字符串以形成回文。 为此,有两条规则: (a)减少一封信的价值,例如改变' d'到了'但是不能改变' c'到了'。 (b)为了形成一个回文,你可以反复减少一个字母的价值,直到这封信成为“a”。一旦信件改为' a',就不能再更改了。
任何字母值的每次减少都算作一次操作。找到将给定字符串转换为回文所需的最小操作数。
这是一个黑客问题:"爱情字母之谜"
当我解决它时,我犯了很多错误,我使用char *str[n]
和gets
来输入字符串。我认为它会起作用,但很久以后我意识到我根本没有分配任何空间。后来我想出了用于存储字符串的二维数组char[n][1000]
,scanf
似乎对我有效。
这是我的解决方案:
int main() {
int i, n, len, pos, ops, end;
scanf("%d",&n);
char str[n][10000];
char a,b;
for (i=0;i<n;i++) {
scanf("%s",str[i]);
}
for (i=0;i<n;i++) {
len = strlen(str[i]);
pos = 0;
end = len - 1;
ops = 0;
while ( pos < end) {
a = str[i][pos];
b = str[i][end];
if ( a != b ) {
if ( b > a )
ops = ops + (b -a);
else
ops = ops + (a -b);
}
pos++;
end--;
}
printf("%d\n", ops);
}
return 0;
}
这完美无缺。 此外,我必须在程序中假设字符串的最大长度为1000,因为这是约束之一。
如何在不使其过于复杂的情况下改进此解决方案? 我正在寻找存储和比较的建议。
答案 0 :(得分:1)
嗯,您可以#include <string.h>
并使用strcmp
/ strncmp
来比较字符串。
硬编码长度存在风险:您需要使用fgets
(#include <stdio.h>
)来控制输入的长度。