C++ 如何通过删除最少数量的字符来获取子字符串?
在这个问题中,我们使用两个字符串作为输入,比如s1和s2 现在,首先我们需要检查s2是否是s1的子序列。如果没有,请打印“否” 但如果是,我们需要打印从s1中删除的最小字符数,以获得s2 这篇课文 在这里,无需删除任何字符即可直接找到文本,因此答案为0 Eg-切薯片酥 在这种情况下,答案是9 到目前为止我所做的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
#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()
。您要么想进一步研究这个问题,要么自己想一想解决这个问题的不同方法。