【牛客网】删除公共子序列

【牛客网】删除公共子序列

链接:https://www.nowcoder.com/practice/f0db4c36573d459cae44ac90b90c6212?tpId=85&&tqId=29868&rp=1&ru=/activity/oj&qru=/ta/2017test/question-ranking
题目描述
输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”

输入描述:
每个测试输入包含2个字符串
输出描述:
输出删除后的字符串
示例
输入
They are students.
aeiou
输出
Thy r stdnts.

解题思路
1.本体是一个删掉公共子串的问题,本题最常规的解法是暴力查找删除,代码复杂度更高且效率很低。我们采用一种哈希映射(一一对应)的方法,可以巧妙的解决此题。
2.我们找到公共子串后,不要采用删除的方法,应为其每个位置对应的字符,再删除时,数据挪动,遍历的时候容易出现问题,我们用一个新的字符串来保存删除公共字符后的剩余字符,返回新字符串。
解题过程
1.输入两个字符串时,因为其可能出现空格,不能使用cin输入,应使用getline(cin,str)
2.使用哈希映射的思想,统计str2中字符出现的次数
3. 遍历str1,str1[i]映射array对应位置为0,则表示这个字符在str2中没有出现过,则将他+=到新字符串str3上。注意这里最好不要str1.erases(i),因为边遍历边删除代码不好控制,容易出现问题。
代码如下:

#include<iostream>
#include<string>
using namespace std;
int main()
{
    string str1;
    string str2;
    getline(cin,str1);
    getline(cin,str2);
    int array[256] = {0};
    for(int i = 0;i<str2.size();i++)
    {
        array[str2[i]]++;
    }
    string str3;//用新字符串来保存str1删除后的字符串
    for(int i = 0;i<str1.size();i++)
    {
        if(array[str1[i]] == 0)
        {
            str3 += str1[i];
        }
        
    }
    cout<<str3<<endl;
}
发布了8 篇原创文章 · 获赞 29 · 访问量 425

猜你喜欢

转载自blog.csdn.net/qq_43676757/article/details/104860926