nyoj915 +-字符串(贪心)

80 阅读2分钟

+-字符串

时间限制: 1000 ms  |  内存限制: 65535 KB

难度: 1

    • 描述

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

        • 输入

        • 多组测试数据

          每组数据有两行,每行包含一个由”+”和”-“最成的字符串。每个子符串长度不超过5000。

        • 输出

        • 仅一个整数,输出最少需要操作的次数。如果答案不存在,输出-1。

        • 样例输入

        • ++-+--+ 
          -++--++ 
          
        • 样例输出

        • 4
          

          代码:(别人的,先存下,自己的稍后贴)

          NUM 1:

          #include <stdio.h>
          #include <string.h>
          int main()
          {
              char a[5001];
              char b[5001];
              int i,j,m1,m2;
              int count;
              int len;
              while(scanf("%s%s",a,b)!=EOF)
              {
                  m1=m2=0;
                  len=strlen(a);
                  for(i=0; i<len; i++)
                  {
                      if(a[i]=='+')
                          m1++;
                      if(b[i]=='+')
                          m2++;
                  }
                  if(m1!=m2)
                  {
                      printf("-1\n");
                      continue;
                  }
                  //特判加号数量是否相等,不想等直接不存在
                  count=0;//记录操作的次数
                  for(i=0; i<len; i++)
                  {
                      if(a[i]!=b[i])//判断两个字符串的对应字符是否相等
                      {
                          for(j=i+1; j<len; j++)
                          {
                              if(a[j]==b[i])
                                  break;
                          }
                          count+=j-i;
                          a[j]=a[i];
                      }
                  }
                  printf("%d\n",count);
              }
              return 0;
          }
          

          NUM2:\

          #include<iostream>
          #include<cstdio>
          #include<cstring>
          #include<cstdlib>
          #include<cmath>
          #include<algorithm>
          using namespace std;
          int main()
          {
              string a,b;//子串长度不超过五千,求把a转化为b的次数
              int n;
              while(cin>>a>>b)
              {
                  int ap=0,ad=0,bp=0,bd=0;
                  for(int i=0; i<a.length(); i++)
                  {
                      if(a[i]=='+')
                          ap++;
                      else
                          ad++;
                  }
                  for(int i=0; i<b.length(); i++)
                  {
                      if(b[i]=='+')
                          bp++;
                      else
                          bd++;
                  }
                  int co=0;
                  if(ap!=bp||ad!=bd)//一定不可能
                      printf("%d\n",-1);
                  else
                  {
                      for(int i=0; i<a.length();)
                      {
                          if(a[i]==b[i])
                              i++;
                          else
                          {
                              for(int j=i; j<a.length()-1;)
                              {
                                  if(a[j]==a[j+1])
                                      j++;
                                  else
                                  {
                                      co++;
                                      char c=a[j];
                                      a[j]=a[j+1];
                                      a[j+1]=c;
                                      break;
                                  }
                              }
                          }
                      }
                  }
                  printf("%d\n",co);
              }
              return 0;
          }
          

          \

          我的代码:

          \

          \

        • 如图所示,变换方式这样

        • #include <stdio.h>
          #include <string.h>
          int main()
          {
              char a[5000];
              char b[5000];
              while(~scanf("%s%s",a,b))
              {
                  int m1=0,m2=0;
                  int len=strlen(a);
                  for(int i=0;i<len;i++)
                  {
                      if(a[i]=='+')
                          m1++;
                      if(b[i]=='+')
                          m2++;
                  }
                  if(m1!=m2)
                  {
                      printf("-1\n");
                      continue;
                  }//筛掉+号数量不相等的情况
                  int sum=0;
                  for(int i=0;i<len;i++)//遍历所有的地一串字符
                  {
                      int j;
                      if(a[i]!=b[i])//当两列字符串不相等时
                      {
                          for(j=i+1;j<len;j++)//贪心策略:寻找在第一个字符串中与第二个字符串匹配的符号
                          {
                              if(a[j]==b[i])
                                  break;//找到位置
                          }
                          sum+=j-i;//找到了位置经过j-i次变换
                          a[j]=a[i];//变换后把前面的符号和后面交换
                      }
                  }
                  printf("%d\n",sum);
              }
              return 0;
          }
          


          \

        • PS:贪心,一步一步考虑,慢慢换\

        • \

        • 2018年06月04日13:09:29 java代码

        • import java.util.Scanner;
          
          class Main {
          
              static final int N = 5000 + 10;
              static char[] a = new char[N];
              static char[] b = new char[N];
          
              public static void main(String[] args) {
                  Scanner io = new Scanner(System.in);
                  while (io.hasNext()) {
                      String s1 = io.next();
                      String s2 = io.next();
                      int len = s1.length();
                      a = s1.toCharArray();
                      b = s2.toCharArray();
                      int sum1 = 0, sum2 = 0;
                      for (int i = 0; i < len; i++) {
                          if (a[i] == '+')
                              sum1++;
                          if (b[i] == '+')
                              sum2++;
                      }
                      if (sum1 != sum2) {
                          System.out.println(-1);
                          continue;
                      }
                      int ans = 0, i, j;
                      for (i = 0; i < len; i++) {
                          if (a[i] != b[i]) {
                              for (j = i + 1; j < len; j++) {
                                  if (a[j] == b[i])
                                      break;
                              }
                              ans += j - i;
                              a[j] = a[i];
                          }
                      }
                      System.out.println(ans);
                  }
              }
          }
          

          \

        • \