如何检查字符串是否是另一个字符串的正确子集
How to check if string is a proper subset of another string
我想检查字符串是否是 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;
}
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 我如何通过引用将 c++ 字符串分配给另一个字符串
- 使用另一个字符串从字符串中删除空格
- 有没有办法使用 strcpy 将字符串数组复制到另一个字符串或其他数组中?
- 当分配一个字符串值并稍后通过分配另一个值进行更改时C++如何管理内存?
- 如何在不知道对应关系的情况下在字符串中搜索字符并将其分配给另一个字符?
- 如何在使用 getch 后在另一个字符串的末尾连接一个字符串
- 如何在另一个字符串的x位置插入一个字符串?
- 从 C 字符串构造 std::string 与从另一个 std::string 构造 std::string 不一致
- C++:递归地将字符串中一个字母的所有实例替换为另一个字母
- 在另一个字符串中插入文件扩展名之前的字符串
- 使用C++将一个字符串替换为另一个字符串
- 将字符从一个字符串简单分配到另一个字符串不起作用
- 将 int 转换为字符串,然后连接另一个变量以创建完整扩展名,然后将其转换为 const_char*
- 将字符串中的单个单词替换为另一个单词
- 将文本流中一个字符串的所有匹配项替换为另一个字符串
- 无法将字符串用作另一个类的参数
- 另一个字符串文字,UDL 迷宫
- 在给定字符串上使用 tolower() 和 isalpha() 并将其输出设置为另一个字符串
- 如何使用循环从另一个字符串创建一个没有空格的新字符串