如果兩個字符串中0和1的個數分別相等,則稱該對字符串為相等。
方法一:
由於string類對於讀取文件中子串以及比較都很方便,所以,用string類的對象來逐對存放字串,然后將字串分別排序后對其進行比較是直接的思路。
1 #include<iostream> 2 #include<fstream> 3 #include<algorithm> 4 using namespace std; 5 6 int main() 7 { 8 ifstream in("string.txt"); 9 for (string s, t; in >> s >> t;) 10 { 11 sort(s.begin(),s.end); 12 sort(t.begin(),t.end); 13 cout << (s==t?"yes\n":"no\n"); 14 } 15 }
程序中用到了算法sort調用,所以要包含算法庫頭文件algorithm。
方法二:
基本的排序算法需要對所有元素進行兩重循環的操作,最快的排序算法也需要O(nlogn)數量級的運算次數,然而,如果僅對字串分別數一下1和0的個數,再比較其個數值,效率會更高:
1 #include<iostream> 2 #include<fstream> 3 #include<algorithm> 4 using namespace std; 5 6 int main() 7 { 8 ifstream in("string.txt"); 9 for (string s, t; in >> s >> t;) 10 { 11 int sc1 = count(s.begin(), s.end(),'1'); 12 int sc0 = count(s.begin(), s.end(), '0'); 13 int tc1 = count(t.begin(), t.end(), '1'); 14 int tc0 = count(t.begin(), t.end(), '0'); 15 cout << (sc1==tc1&&sc0==tc0?"yes\n":"no\n"); 16 } 17 }
count計數也包含在C++標准庫中,由於count算法只有一重循環的處理時間,雖然程序中有4次count調用,但比較排序算法,對於元素個數激增時,其效率能明顯體現出來。當然有些讀者可能看到了還能對其做進一步優化:count算法是線性的,無論如何,一重循環是不可避免的。
方法三:
根據問題描述,字串中非1即0, so,“0”的個數在總長度已知的情況下,可以不使用count算法,通過並列地判斷總長度的相等性而直接得到:
1 #include<iostream> 2 #include<fstream> 3 #include<algorithm> 4 using namespace std; 5 6 int main() 7 { 8 ifstream in("string.txt"); 9 for (string s, t; in >> s >> t;) 10 { 11 int s1 = count(s.begin(), s.end(), '1'); 12 int t1 = count(t.begin(), t.end(), '1'); 13 cout << (s1==t1&&s.length()==t.length()?"yes\n":"no\n"); 14 } 15 }
總結:
上述程序不但在語句行上縮減了兩行,更重要的是通過代碼優化而提高了效率。
提高程序運行的效率,在編程階段主要有三個途徑:
(1)吃透問題,采用合理的方案設計;
(2)采用盡可能有效的算法;
(3)采用合理的程序結構、內存布局和代碼優化。
上述三者是相輔相成的,你中有我,我中有你。吃透了問題實質,才能合理選擇算法;采用更有效的算法,才能實現代碼優化;代碼優化本身,又是對問題的確切把握。