zoukankan      html  css  js  c++  java
  • NYOJ-+-字符串

    +-字符串

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

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

    太水啊。这样也能通过。哈哈。
    思路大致是这样的:
      输出-1的这种情况:当两个字符串长度或者+号的个数不相等时,肯定不匹配,应输出-1;
      非-1情况:记录两个字符串中+号的位置。匹配后,第一个字符串的第i个+号肯定和第二个字符串的第i个+号相匹配的。
            那么只需把各个+号的位置差算出即可。这些差的和也就是最后结果。
     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #include <string.h>
     4 int a[5000],b[5000];
     5 char s1[5000],s2[5000];
     6 int main(void){
     7     while(scanf("%s%s",s1,s2) != EOF){
     8         int len1 = strlen(s1),m = 0;
     9         for(int i = 0; i < len1; i++){
    10             if(s1[i] == '+')
    11                 a[m++] = i;
    12         }
    13         int len2 = strlen(s2),n = 0;
    14         for(int i = 0; i < len2; i++){
    15             if(s2[i] == '+')
    16                 b[n++] = i;
    17         }
    18         if(len1 != len2 || m != n){
    19             printf("-1
    ");
    20             continue;
    21         }
    22         int result = 0;
    23         for(int i = 0; i < n; i++){
    24             result += abs(a[i] - b[i]);
    25         }
    26         printf("%d
    ",result);
    27     }
    28     return 0;
    29 }
  • 相关阅读:
    C++读取XML,开进程,开线程
    WinRT 异步模型
    记一个宣告失败的项目Metro VS2012RC的感性认识
    [翻译]深入理解Win32结构化异常处理(四)
    Google Test 测试架构探究
    .NET FrameWork 技术内幕
    [翻译]深入理解Win32结构化异常处理(三)
    谈一谈软件开发
    ExecutionContext & SynchronizationContext
    软件制作:QQPenguin辅助工具
  • 原文地址:https://www.cnblogs.com/yfs123456/p/5669168.html
Copyright © 2011-2022 走看看