南阳理工OJ915解题报告

描述
Shiva得到了两个只有加号和减号的字符串,字串长度相同。Shiva一次可以把一个加号和它相邻的减号交换。他想知道最少需要多少次操作才能把第一个字符串变换成第二个字符串。你现在要去帮助他完成那个这个问题。
输入
多组测试数据

每组数据有两行,每行包含一个由”+”和”-“最成的字符串。每个子符串长度不超过5000。
输出
仅一个整数,输出最少需要操作的次数。如果答案不存在,输出-1。
样例输入
++-+--+ 
-++--++ 

样例输出

4

首先要解决的问题是如何判断有没有解。这个问题好解决,因为字符串长度相等,只要加减号的个数一致就行了,我们可以通过分别统计两个字符串加(减)号的个数,如果结果相等则有解,反之无解

其次是怎样求最小移动次数,我们的贪心策略是从左到右遍历,当出现不一样的符号时我们寻找最近的可以使符号相同的字符的位置,找到后,该位置变成另一种符号(因为是从左到右,所以不用管开始的位置)

AC代码

#include<stdio.h>
#include<string.h>

const int maxn = 5000 + 10;
char s1[maxn], s2[maxn];
int n;

int find_min(int i)
{
    for(int j = i + 1; j < n; j++)
        if(s1[j] == s2[i]) return j;
    return -1;    //实际上并不会发生
}

int main()
{
    while(scanf("%s%s",s1,s2) == 2)
    {
        n = strlen(s1);

        //统计两个字符串中加号的个数
        int sum1,sum2;
        sum1 = sum2 = 0;
        for(int i = 0; i < n;i++)
        {
            if(s1[i] == '+') sum1++;
            if(s2[i] == '+') sum2++;
        }

        //判断并求解
        int count = 0;
        if(sum1 != sum2) printf("-1\n");
        else
        {
            for(int i = 0; i < n; i++)
            {
                if(s1[i] != s2[i])
                {
                    int pos = find_min(i);
                    s1[pos] = s1[i];
                    count += pos - i;
                }
            }
        }
        printf("%d\n",count);
    }
    return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值