1. 程式人生 > >+-字串(簡單貪心)

+-字串(簡單貪心)

+-字串

時間限制:1000 ms  |  記憶體限制:65535 KB

難度:1

描述

Shiva得到了兩個只有加號和減號的字串,字串長度相同。Shiva一次可以把一個加號和它相鄰的減號交換。他想知道最少需要多少次操作才能把第一個字串變換成第二個字串。你現在要去幫助他完成那個這個問題。

輸入

多組測試資料

每組資料有兩行,每行包含一個由”+”和”-“最成的字串。每個子符串長度不超過5000。

輸出

僅一個整數,輸出最少需要操作的次數。如果答案不存在,輸出-1。

樣例輸入

++-+--+ -++--++

樣例輸出

4

思路:讀完題思路很清晰,遍歷比較每個字串元素是否相同,不同則判斷操作次數並累加。用到了貪心的思想,並不抽象,很直觀。感覺該題和貪心問題的開燈關燈問題很像。(但我還是入了考慮不全面的坑,實在是太菜了)。

程式碼如下:

#include<iostream>
#include<string>
#include<cmath>
#include<stdio.h>
using namespace std;
int main() 
{
        string s1,s2;
        int i,j,a=0,b=0; 
        while(cin>>s1>>s2)
        {
           int s=0;
           int l1=s1.length();
           int l2=s2.length();
           if(l1!=l2)
           {
               printf("-1\n");
               continue;//判斷字串長度是否相等 
           }
           for(i=0;i<l1;i++)
	   {
		  if(s1[i]=='+')
		  a++;
		  if(s2[i]=='+')
		  b++; 
	   } 
           if(a!=b) 
           {
                printf("-1\n");
                continue;//判斷兩字串中+個數是否相同 
           }
           for(i=0;i<l1;i++)//滿足長度與加號數量相同的條件下遍歷
           {
               if(s1[i]!=s2[i])
               {
               	   for(j=i+1;j<l1;j++)//該位置的符號不同判斷操作次數 
               	   {
               	  	   s++;
               	  	   if(s1[j]!=s1[i])
               	  	   {
               	  	  	  s1[j]=s1[i];
               	  	  	  break;
			   }
		   }
	      }
           }
           printf("%d\n",s);
           s1.clear(); 
           s2.clear();//因為是多組資料輸入,所以字串要清空 
        }
    return 0;
}