NYOJ-915 +-字符串(贪心)

字符串转换挑战
解决一个字符串匹配问题,通过交换字符使两个由加号和减号组成的字符串相同。介绍了一个贪心算法来找出最少的操作次数。

+-字符串

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

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


思路:贪心,对比两个串,每次找到不一样的就在原串中搜索下一个与当前不一样的,然后交换。



AC代码:
 1 #include <stdio.h>
 2 #include <string.h>
 3 int main(void)
 4 {
 5     char string_change[5005],string_source[5005];
 6     while (~scanf("%s %s", string_source, string_change))
 7     {
 8         int plus_source, sub_source, plus_change, sub_change;
 9         plus_source = sub_source = plus_change = sub_change = 0;
10         int len_source = strlen(string_source), len_change =
11             strlen(string_change);
12         for (int i = 0; i < len_source; i++)
13         {
14             if (string_source[i] == '+')
15                 plus_source++;
16             else
17                 sub_source++;
18         }
19         for (int i = 0; i < len_change; i++)
20         {
21             if (string_change[i] == '+')
22                 plus_change++;
23             else
24                 sub_change++;
25         }
26         int count = 0;
27         if (plus_source == plus_change&&
28             sub_source == sub_change)
29         {
30             for (int i = 0; i < len_change; i++)
31             {
32                 if (string_source[i] != string_change[i])
33                 {
34                     for (int j = i + 1; j < len_change; j++)
35                     {
36                         if (string_change[i] != string_change[j])
37                         {
38                             count += (j - i);
39                             string_change[j] = string_change[i];
40                             break;
41                         }
42                     }
43                 }
44             }
45             printf("%d\n", count);
46         }
47         else
48             printf("-1\n");
49     }
50     return 0;
51 }

 

转载于:https://www.cnblogs.com/ray-coding-in-rays/p/6211632.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值