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

How to check if string is a proper subset of another string

本文关键字:字符串 另一个 子集 是否是 检查 何检查      更新时间:2023-10-16

我想检查字符串是否是 strictly 另一个字符串的子集。为此,我使用了boost ::包含,我比较字符串的大小如下:

#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
  • 的适当子集

我将使用以下内容:

bool is_substr_of(const std::string& sub, const std::string& s) {
  return sub.size() < s.size() && s.find(sub) != s.npos;
}

这仅使用标准库,并且首先进行大小检查,该检查比s.find(sub) != s.npos便宜。

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

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

如果字符串包含一个字符串,并且两者都不相等,则有一个真实的子集。

如果这比您的方法要好,您可以决定。它的键入且非常清晰(IMO),但是如果两个字符串长且相等或以相同的长序列开始,则可能会慢一点。

注意:如果您真的在乎性能,则可能需要尝试Boyer-Moore搜索和Boyer-Moore-Horspool搜索。它们的速度比任何琐碎的字符串搜索要快)(如stdlibc 的字符串搜索中所使用,请参见此处),我不知道boost::contains是否使用它们。

关于比较操作

tl; dr:确定要比较的格式。

警惕您如何定义严格。

例如,您没有指出问题问题是您的问题,但是如果我提交,请说:

 "ABC       " //IE whitespaces
 "ABCn"

您对此有何看法?你接受还是不接受?如果不这样

无论如何,正如Baum指出的那样,您可以使用==检查字符串的平等性,也可以使用size()或CC_7或length();

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

#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;
}
相关文章: