我想检查字符串是否是严格另一个字符串的子集。 为此,我使用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;
}
有没有更好的方法来解决这个问题?而不是比较字符串的大小?
答案 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;
}