解题思路:

题目的最终结果:

对任给的两个字符串A和B,计算出将字符串A变换为字符串B所用的最少字符操作次数。

就是说要把两个字符串变为一模一样。

首先个数一定要一样!

参考代码:

    x1=strlen(a);

    x2=strlen(b);

    x=fabs(x1-x2);

x求的是两个字符串相差的个数。

    相当于前两个条件

    1. 删除一个字符; 
    2. 插入一个字符;

然后算出两个字符串中相同字符的个数。

参考代码:

    for(i=0;i

{

    for(j=0;j

    {

    if(a[i]==b[j])number++;

    }

}

下一步就可以用两个字符串中的较少的字符串的数量减取相同的字符的数量。

相当于第三个条件:

3. 将一个字符改为另一个字符。

    参考代码:

    min=(x1>x2?x2:x1);

    y=min-number;

最后得到x+y的总和就是答案,即最少字符操作次数。

注意事项:
因为不知道x1>x2还是x2>x1,因此要用fabs(x1-x2)得到绝对值,当然用abs(x1-x2)也是一样的。头文件:#include

求a,b两个字符串要用到strlen,因此头文件要加上:#include

x1>x2?x1:x2的意思可能一些小白还不知道,这里解释一下,如果x1>x2得到x1,否则x2,就是说求max,也就是两个中的最大值。这样写比较方便操作。

当然也可以用if语句来做,稍微长一些。

((x1>x2?x1:x2)>x3)?(x1>x2?x1:x2):x3这个语句可以求3个数中的最大值。

最后最重要的是点个赞~

参考代码:

#include

#include

#include

int main()

{

char a[200],b[200];

int i,j,x1,x2,x,y,number=0,min;

scanf("%s\n%s",a,b);

getchar();

x1=strlen(a);

x2=strlen(b);

x=fabs(x1-x2);

for(i=0;i

        {

for(j=0;j

    {

if(a[i]==b[j])number++;

    }

        }

min=(x1>x2?x2:x1);

y=min-number;

printf("%d\n",x+y);

return 0;

评论区有小伙伴提出了字符相同的情况,于是我加了一点代码,如下:

#include <stdio.h>

#include <string.h>

#include <math.h>

int main()

{

char a[200],b[200];

int i,j,x1,x2,x,y,number=0,min,number1=0;

scanf("%s\n%s",a,b);

x1=strlen(a);

x2=strlen(b);

getchar();

x=fabs(x1-x2);

if(x!=0)

{

for(i=0;i<(x1>x2?x1:x2);i++)

    {

for(j=0;j<(x1>x2?x1:x2);j++)

        {

if(a[i]==b[j])number++;

        }

    }

min=(x1>x2?x2:x1);

y=min-number;

printf("%d\n",x+y);

}

else if(x==0)

            {

for(i=0;i<x1;i++)

    {

if(a[i]!=b[i])number1++;

    }

printf("%d",number1); 

             }

return 0;

这样就解决了评论区中abcd和acbd输出为0的情况,正确答案应该是2.

已经修改bug!

点赞(0)
 

0.0分

6 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 7 条评论

落叶无情 3年前 回复TA
@贪狼先生 首先两个字符串可能相同,也可能不同,你默认P1>P2的长度,如果P2长的话,结果为0也可能,但肯定得修改。而且题目的字符串数组的长度也没有定义,你这个直接把题目作死了
贪狼先生 3年前 回复TA
char p1[8],p2[8];
      int i,j,l,sum=0;
    for(i=0;i<7;i++)
        scanf("%c",&p1[i]);
    for(j=0;j<5;j++)
        scanf("%c",&p2[j]);

    for(i=0;i<8;i++)
    {
       for(j=0;j<8;j++)
       {
           if(p1[i]==p2[j])
            sum++;
       }
    }
    l=strlen(p1);
    printf("%d",l-sum);
为什么这个解不可以
落叶无情 3年前 回复TA
@刘涛任 已经修改BUG了,文章修改了下
落叶无情 3年前 回复TA
@刘涛任 确实诶,还有考虑一个X=0的情况,二者字符相同,然后用数组遍历查找两个字符串不同的字符数量,然后输出这个数量
刘涛任 3年前 回复TA
这么解应该存在bug吧,比如abcd,acbd,字符数量相同,没有不同字符,用这个代码是不是就输出0了。
落叶无情 3年前 回复TA
@可惜月不识我 因为a+1是指a[1]的地址不是a[1]的值,用指针就可以*(a+i)这种,或者下标法a[i],建议新手还是用下标法a[i]简单明了
可惜月不识我 3年前 回复TA
#include<stdio.h>
int main()
{
	int a[100];
	int n;
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	scanf("%d",&a[i]);
	int l=2;
		printf("%d",a+1);
	return 0;
}
为啥会乱码