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 }