一个奇怪的问题 - 如何生成与一组字符串中的任何字符串不匹配的字符串?我不想对字符串做任何假设。理想情况下,解决方案基于STL,但不一定是
示例:
vector<string> strings;
/*...*/
string unMatching = generateUnmatching(strings); //this is the function I want
assert(find(strings.begin(), strings.end(), unMatching) == strings.end());
答案 0 :(得分:6)
一种方法是使用diagonalization:
另一种方法是复制集合中最长的字符串,并将任何字符附加到副本。这个新字符串将与集合中的每个字符串不同。
还有其他各种方法来完成同样的事情。为问题添加一些约束将有助于选择对您的问题最有意义的算法。例如,您可能决定生成与集合中的任何字符串不匹配的最短字符串,或者具有最低lexigraphic排序值的字符串,或者与其他字符串共同具有最小字符数的字符串,或者......
答案 1 :(得分:2)
如果您对结果字符串没有任何要求,可以直接执行:
string answer = "a";
while (find(strings.begin(), strings.end(), unMatching) != strings.end())
answer += "a";
显然它似乎不是你想要的。
这是优化的解决方案,可帮助您在最短的时间内找到最短的答案:
优化实现的时间复杂度为O(number_of_characters_in_all_strings),而使用向量循环和查找的简单实现将为O(number_of_strings * lenth_of_string)。
答案 2 :(得分:1)
您可以使用uuid生成器,例如boost中的那个:
#include <boost/uuid/uuid.hpp>
#include <boost/uuid/uuid_io.hpp>
#include <boost/uuid/uuid_generators.hpp>
int main()
{
using namespace boost::uuids;
random_generator gen;
uuid u = gen();
std::string s = to_string(u);
std::cout << s;
}
答案 3 :(得分:0)
你可以使用一个随机数生成器(下面的例子)我认为ascii可打印字符从33开始到127结束,从-1到-95
#include <stdlib.h>
#include <stdio.h> //only for printf
#define RANDINT(r) ((int)(r * (float)random() /(float)RAND_MAX + 0.5))
#define OFFSETRANDINT(r,o) (RANDINT(r) + o)
#define RANDINTX2Y(x,y) (OFFSETRANDINT((y-x),x))
int main(){
srandom(time(NULL)); // important to call this first, but only once
printf("%d\n",RANDINT(2147483647)); //a random int between 0 and 2147483647
printf("%d\n",OFFSETRANDINT(10,10)); //starting @ 10 with a range of 10 (10-20)
printf("%d\n",RANDINTX2Y(0,10)); //between 0 and 10
}
您可能需要将int强制转换为(char),以便将其存储在字符串
中然后你可以使用strstr或strcasestr,具体取决于是否重要 如果它返回,只需将每个字符串strcat到“haystack”上! TRUE
#include <string.h>
char *strstr(const char *haystack, const char *needle);
char *strcasestr(const char *haystack, const char *needle);