#include <iostream>
using namespace std;
int main()
{
string str = "cab";
string d = "";
char s[] = {'a', 'b', 'c', 'd', 'e'};
for(int i = 0; i < sizeof(s) / sizeof(s[0]); i++){
for(int j = 0; j < str.length(); j++){
if(str[j] == s[i]){
d += s[i];
}
}
}
cout << d << endl;
return 0;
}
例如,我想检查字符串"cab"是否存在于字符数组中,就像在我的情况下一样,它应该存在,无论在字符数组中元素的位置如何。
假设子字符串不会有重复项,则可以使用unordered_set
。因此,您基本上对s[]
进行迭代,对于每个字符,您将检查集合是否包含该特定字符。
unordered_set
允许O(1)搜索,因此您的算法应该在O(n)(n=s
的大小)中运行。
当您在集合中找到一个也在数组中的字符时,将其移除并继续遍历数组。如果在遍历数组时,集合为空,那么您就知道数组包含该子字符串。您还可以检查该集,以确保每次从中删除字符时该集都不是空的,这将减少执行时间。
不是我的代码:
#include <string>
#include <iostream>
#include <algorithm>
void print(std::string::size_type n, std::string const &s)
{
if (n == std::string::npos) {
std::cout << "not foundn";
} else {
std::cout << "found: " << s.substr(n) << 'n';
}
}
int main()
{
std::string str = "cab";
std::string::size_type n;
std::string const s = "This is a string";
// search from beginning of string
n = s.find("is");
print(n, s);
// search from position 5
n = s.find("is", 5);
print(n, s);
// find a single character
n = s.find('a');
print(n, s);
// find a single character
n = s.find('q');
print(n, s);
//not the best way
for(char c : s)
s.find(c); //will be npos if it doesn't exist
//better
std::includes( s.begin(), s.end(),
str.begin(), str.end() );
}