Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何通过删除最少数量的字符来获取子字符串?_C++_String_Substring_Subsequence - Fatal编程技术网

C++ 如何通过删除最少数量的字符来获取子字符串?

C++ 如何通过删除最少数量的字符来获取子字符串?,c++,string,substring,subsequence,C++,String,Substring,Subsequence,在这个问题中,我们使用两个字符串作为输入,比如s1和s2 现在,首先我们需要检查s2是否是s1的子序列。如果没有,请打印“否” 但如果是,我们需要打印从s1中删除的最小字符数,以获得s2 这篇课文 在这里,无需删除任何字符即可直接找到文本,因此答案为0 Eg-切薯片酥 在这种情况下,答案是9 到目前为止我所做的 #include <bits/stdc++.h> using namespace std; int checkIfSub(string s1, string s2, int

在这个问题中,我们使用两个字符串作为输入,比如s1和s2

现在,首先我们需要检查s2是否是s1的子序列。如果没有,请打印“否”

但如果是,我们需要打印从s1中删除的最小字符数,以获得s2

这篇课文

在这里,无需删除任何字符即可直接找到文本,因此答案为0

Eg-切薯片酥

在这种情况下,答案是9

到目前为止我所做的

#include <bits/stdc++.h>
using namespace std;

int checkIfSub(string s1, string s2, int m, int n)
{
    int j = 0;
    for(int i = 0; i < m && j < n; i++)
        if(s1[i] == s2[j])
            j++;
    if(j == n)
        return 0;
    else 
        return 1;
}
int check(string s1, string s2)
{
    int count = 0; string s3;
    if(checkIfSub(s1, s2, s1.length(), s2.length()) == 1 || s2.length() > s1.length())
    {
        cout << "NO\n"; return 0;
    }
    int j = 0;
    for(int i = 0; i < s1.length(); i++)
    {
        if(s1[i] == s2[j])
        {
            s3[j] = s1[j];
            j++; continue;
        }
        count++;
    }
    cout << "YES " << count << "\n";
    return 0;
}

int main() {

    string s1, s2;
    cin >> s1 >> s2;
    check(s1, s2);

    return 0;
}
#包括
使用名称空间std;
int checkIfSub(字符串s1、字符串s2、int m、int n)
{
int j=0;
对于(int i=0;is1.length())
{
couts2;
检查(s1,s2);
返回0;
}
我的代码在第二个示例中运行良好,但在第一个示例中失败


(这是我在网上读到的一些采访中提出的问题。)

试试这样的方法:

#包括
#包括
使用名称空间std;
布尔检查(常量字符串和s1、常量字符串和s2、int和minToDelete)
{
minToDelete=0;
bool anySubSeqFound=false;
if(s2.empty())
返回false;
字符串::size\u type first=0;
while((first=s1.find(s2[0],first))!=string::npos)
{
int numDeleted=0;
bool isSubSeq=真;
字符串::size\u type next=first+1;
对于(字符串::size_type j=1;j抛开其他问题不谈,您创建了空字符串
s3
,似乎用语句
s3[j]=s1[j]对其进行了无效写入
,并且除此之外永远不要使用它。你能解释代码的那一部分吗?不相关,但你应该看看并避免潜在的问题。我认为你只是混淆了返回代码
checkIfSub
。它真的应该返回0(false)当
s2
的所有字符都匹配时?@FrançoisAndrieux OP正在搜索子序列,而不是子序列,即问题是,是否可以从
s1
中删除字符,使其成为
s2
。因此
crisp
剪切优先权
的子序列(强调我的^).OP:不管实现有什么问题,您的算法太简单,无法检查您要检查的内容。它所做的只是计算
s1.lenght()-s2.length()
。您要么想进一步研究这个问题,要么自己想一想解决这个问题的不同方法。