7-29 刪除字符串中的子串(20 分)
輸入2個字符串S1和S2,要求刪除字符串S1中出現的所有子串S2,即結果字符串中不能包含S2。
輸入格式:
輸入在2行中分別給出不超過80個字符長度的、以回車結束的2個非空字符串,對應S1和S2。
輸出格式:
在一行中輸出刪除字符串S1中出現的所有子串S2后的結果字符串。
輸入樣例:
Tomcat is a male ccatat
cat
輸出樣例:
Tom is a male
思路:S1的每個字符與S2[0]進行比較,相等的話進行遞歸查詢看是否S2中所有字符都能匹配到,匹配到則刪除,這個思路很簡單,但沒有完全發揮到string的用處,而且還有兩個測試點過不去,且分析為玄學。然后我百度了下string相關函數的用法,用find函數進行查找,然后再用erase函數進行刪除,最后直接輸出S1就行了。
這個是我第一次沒有AC的代碼—。—

#include<stdio.h> #include<string> #include<sstream> #include<iostream> using namespace std; int f(string s1, string s2, int s11, int s22 = 0) //遞歸查詢之后的字符是否匹配 { if (s1[s11] == s2[s22]) return 1 + f(s1, s2, s11 + 1, s22 + 1); return 0; } int main() { string s1, s2; getline(cin, s1); getline(cin, s2); int len = s1.length(); //len用來記錄當前S1的長度 for (int i = 0; i <= len - s2.length(); i++) { if (s1[i] == s2[0]) //進行匹配 { if (f(s1, s2, i) == s2.length()) { for (int j = i; j < len - s2.length(); j++) s1[j] = s1[j + s2.length()]; i -= 2; //將刪除后循環指向前一個字符 len -= s2.length(); //更新當前S1長度 } } } for (int i = 0; i < len; i++) //進行輸出 { cout << s1[i]; } cout << endl; return 0; }
下面是AC代碼
1 #include<string> 2 #include<iostream> 3 using namespace std; 4 int main() 5 { 6 string s1, s2; 7 getline(cin, s1); //行輸入 8 getline(cin, s2); 9 10 while (s1.find(s2) < s1.length()) //判斷S1中是否還存在S2 11 { 12 s1=s1.erase(s1.find(s2), s2.length()); //將S1中的S2刪除掉 13 } 14 cout << s1 << endl; 15 16 return 0; 17 }
我覺得string比char字符串好用了很多,而且還自帶函數簡直方便的不行,下面是一個string常用函數用法鏈接
http://blog.csdn.net/fdqw_sph/article/details/54233971