注意:问题已经解决了!谢谢你的所有帮助
我想从用户那里得到两个字符串(s1,s2)并检查s2中是否存在s1。 我写了下面的代码。它找到了字符串,但它并不关心字母的顺序。 我怎样才能改变它,例如
S1 =" ABCD" &安培; S2 =" ooabzzzzzzcd" 它必须说是,它确实如此。 S1 =" ABCD" &安培; S2 =" aczzzzzzzzbd"它必须说不,但它没有 我也想要它,所以如果一封信被使用了两次,它就不会混淆这样的顺序 S1 =" mammid" &安培; S2 =" ammizzzzd" 我的程序会在这种情况下说“是”
PS。我使用了s3并放了一个" x"在第一个中只是为了把我从另一个字符串中比较得到的字符串。我把" x"在s1的第一个中,所以没有问题
#include <iostream>
#include <string>
using namespace std;
int main()
{
std::string s1;
std::string s2;
std::string s3="x ";
int x,y=0,i,cow;
std::getline(std::cin, s1);
std::getline(std::cin, s2);
for ( cow = 0; cow < s2.size(); cow++)
{
for( i=cow;i<s2.size();i++){
if (s1[cow] == s2[i]){
s3=s3+s2[i];
cout<<s3<<endl;
break;
}
}
}
//the problem is with the part on top
s1="x "+s1;
if (s1 == s3)
std::cout << "YES";
if (s1 != s3)
std::cout << "NO";
return 0;
}
答案 0 :(得分:0)
您需要重新考虑您的算法。
据我所知,以下似乎是不变量:
s2
必须包含s1
,s1
,这就是我提出的:
/**
* str == s2
* substr == s1
*/
bool contains_in_order(std::string const& str, std::string const& substr) {
size_t sub_index = 0;
//We iterate through each character in the larger string, in order
for (char const& c : str) {
//Whenever we find a matching character, we advance the index.
if (c == substr[sub_index]) sub_index++;
//If the index has reached the end of the substring, we're done.
if (sub_index >= substr.size()) break;
}
//If we didn't reach the end of the substring, we didn't find the whole substring.
return sub_index >= substr.size();
}
然后我们可以像这样重写你的main
函数:
#include <iostream>
#include <string>
int main() {
std::string s1;
std::string s2;
std::getline(std::cin, s1);
std::getline(std::cin, s2);
bool found = contains_in_order(s2, s1);
if (found) std::cout << "YES" << std::endl;
else std::cout << "NO" << std::endl;
return 0;
}