如何检查字符串是否是另一个字符串的一个子集
我想检查一个字符串是否是严格的另一个字符串的子集。 对于为此我用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
你可以只使用==
或!=
比较字符串:
if(contains(str1, str2) && (str1 != str2))
...
如果字符串包含一个字符串,两者不相等,你有一个真正的子集。
如果这比你的方法更适合你决定。它的输入较少,非常清晰(IMO),但如果两个字符串都长且相等,或者两者都以相同的长序列开始,则可能会稍微慢一些。
注意:如果您真的关心性能,您可能需要尝试Boyer-Moore搜索和Boyer-Moore-Horspool搜索。它们比任何简单的字符串搜索都快(正如在stdlibC++中的字符串搜索中使用的那样,请参阅here),我不知道boost::contains
是否使用它们。
关于比较操作
TL; DR:确定您正在比较的格式。
请谨慎对待您如何定义。
例如,你没有指出放入系统的问题是你的问题,但如果我提出假设:
"ABC " //IE whitespaces
"ABC\n"
你怎么看它?你接受与否?如果不这样做,你就必须要么trim
或比较之前清理你的输出 - 在comparaison操作只是一般的音符 -
无论如何,Baum pointed out,你可以使用==
或你要么检查字符串平等可以用size()
或length()
来比较长度(假设您首先检查子字符串会更有效);
是的,这是非常重要的mekap。我不得不提到它。我在做比较之前实际上修整了字符串 –
@HaniGoc是的,我为那些点击这个页面的人写了这个答案,要小心在实际比较之前要做什么操作。 – Mekap
另一种方法,只使用标准库:
#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;
}
'std :: string :: find'看起来更整齐。 – Lingxi
这是另一种方式,你是对的。 std :: search的优点是搜索字符串可以是任何由2个迭代器限定的序列。 –
为什么不直接使用'的std :: string :: find'? – Lingxi
是否与正确的子集类似? –
我会反转测试(即在*调用'contains()'之前检查大小*),除此之外,我认为你不能做得更好。 – Nim