如何检查字符串是否是另一个字符串的正确子集

时间:2015-05-04 12:12:09

标签: c++ string

我想检查字符串是否是严格另一个字符串的子集。 为此,我使用boost::contains并比较字符串的大小,如下所示:

#include <boost/algorithm/string.hpp>
#include <iostream>

using namespace std;
using namespace boost::algorithm;

int main()
{
  string str1 = "abc news";
  string str2 = "abc";
  //strim strings using boost
  trim(str1);
  trim(str2);
  //if str2 is a subset of str1 and its size is less than the size of str1 then it is strictly contained in str1
  if(contains(str1,str2) && (str2.size() < str1.size()))
  {
    cout <<"contains" << end;
  }
  return 0;
}

有没有更好的方法来解决这个问题?而不是比较字符串的大小?

实施例

  • ABC ABC新闻的正确子集
  • ABC 不是 ABC
  • 的正确子集

2 个答案:

答案 0 :(得分:3)

您可以使用==!=来比较字符串:

if(contains(str1, str2) && (str1 != str2))
    ...

如果string包含一个字符串且两者不相等,那么你就有了一个真正的子集。

如果这比您的方法更好,您可以自行决定。它输入较少且非常清晰(IMO),但如果两个字符串都很长且相等或两者都以相同的长序列开始,则可能会慢一些。

注意:如果您真的关心性能,可能需要尝试Boyer-Moore搜索和Boyer-Moore-Horspool搜索。它们比任何简单的字符串搜索更快(在stdlibc ++中的字符串搜索中显然使用,请参阅here),我不知道boost::contains是否使用它们。

答案 1 :(得分:0)

另一种方法,仅使用标准库:

#include <algorithm>
#include <string>
#include <iostream>

using namespace std;

int main()
{
  string str1 = "abc news";
  string str2 = "abc";
  if (str2 != str1
    && search(begin(str1), end(str1), 
              begin(str2), end(str2)) != end(str1))
  {
    cout <<"contains" << endl;
  }
  return 0;
}