13行代码AC_习题3-9 子序列 (UVa10340,All in All)
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                13行代码AC_习题3-9 子序列 (UVa10340,All in All)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                大意:
輸入兩個字符串,判斷串B是否可以通過刪除0~n個字符變成串A,輸入以EOF結尾。
Sample Input
sequence subsequence
 person compression
 VERDI vivaVittorioEmanueleReDiItalia
 caseDoesMatter CaseDoesMatter
Sample Output
Yes
 No
 Yes
 No
分析:
最初我想的是:調用字符串函數修改b,最后b是否能變成a,
 但正確的思路是:b中是否有a的所有字符。
 我把這道題想麻煩了。
提交鏈接→UVa-10340
沒使用過該網站的同學請猛戳這里→vJudge教程
下面我把兩種思路的代碼(都AC了)貼上,供小伙伴們對比,希望避免你們以后踩坑!
欠佳的代碼:
#include <iostream> #include <cstdio> #include <cstring> #include <string>using namespace std ;int main() {string a ; //定義a串 string b ; //定義b串 while(cin>>a>>b) { //輸入a、b串 int len1 = a.length() ; //記錄len1長度 int len2 = b.length() ; //記錄len2長度 int j ; //b數組角標 int num = 0 ; //計數器 for(int i = 0; i < len1; i++) {j = i ; while((a[i] != b[j]) && (num<=len2+1) ) { //最多匹配len2次。 num++ ; b.erase(j,1) ;}} j++ ;int len = b.length() - a.length() ;if (len > 0) b.erase(j,len) ; if(a == b) cout << "Yes" << endl ;else cout << "No" << endl ;}return 0 ; }優化后的代碼:
#include <iostream> using namespace std ; int main() {string s , t ;while(cin >> s >> t) {int i = 0 ;for(auto j : t) //j相當于t[0]~t[len-1] i += j == s[i] ; //若t[x] = s[i] , 則i++cout << (i==s.length()?"Yes":"No") << endl ; }return 0 ; }收獲:
1、這種水題千萬不要想得太復雜,用最簡單的知識就可以AC。復雜的語法反到易錯而臃腫。
最后,分享一條大牛的建議(讓我受益匪淺):平時在做題的時候,一定要尋找最優解,而不是 ac 了就不管了,應該多看看別人的解法。
總結
以上是生活随笔為你收集整理的13行代码AC_习题3-9 子序列 (UVa10340,All in All)的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 15行代码AC——习题3-3 数数字 (
- 下一篇: 算法竞赛入门经典(第二版) | 习题3-
