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