7-29 刪除字符串中的子串


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;
}
View Code

 

 

 

下面是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 }

 

我覺得stringchar字符串好用了很多,而且還自帶函數簡直方便的不行,下面是一個string常用函數用法鏈接

http://blog.csdn.net/fdqw_sph/article/details/54233971

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM