+-字串(簡單貪心)
阿新 • • 發佈:2019-01-22
+-字串
時間限制: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; }