按顺序比较c ++

时间:2017-12-19 21:44:31

标签: c++ string-comparison

注意:问题已经解决了!谢谢你的所有帮助

我想从用户那里得到两个字符串(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;
    }

1 个答案:

答案 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;
}