生成与集合中的字符串不匹配的字符串

时间:2012-03-03 05:43:13

标签: c++ string stl

一个奇怪的问题 - 如何生成与一组字符串中的任何字符串不匹配的字符串?我不想对字符串做任何假设。理想情况下,解决方案基于STL,但不一定是

示例:

vector<string> strings;
/*...*/
string unMatching = generateUnmatching(strings); //this is the function I want

assert(find(strings.begin(), strings.end(), unMatching) == strings.end());

4 个答案:

答案 0 :(得分:6)

一种方法是使用diagonalization

  • 以空字符串开头。
  • 查看集合中第一个字符串的第一个字符。选择除此之外的任何字符,并将其附加到s。
  • 查看集合中第二个字符串的第二个字符。选择除此之外的任何字符,并将其附加到s。
  • 遵循相同的模式,始终查看第i个字符串的第i个字符,并为s添加不同的字符。
  • 当你完成集合中的最后一个字符串时,s将与集合中的每个字符串在至少一个位置上不同。

另一种方法是复制集合中最长的字符串,并将任何字符附加到副本。这个新字符串将与集合中的每个字符串不同。

还有其他各种方法来完成同样的事情。为问题添加一些约束将有助于选择对您的问题最有意义的算法。例如,您可能决定生成与集合中的任何字符串不匹配的最短字符串,或者具有最低lexigraphic排序值的字符串,或者与其他字符串共同具有最小字符数的字符串,或者......

答案 1 :(得分:2)

如果您对结果字符串没有任何要求,可以直接执行:

string answer = "a";
while (find(strings.begin(), strings.end(), unMatching) != strings.end())
    answer += "a";

显然它似乎不是你想要的。

这是优化的解决方案,可帮助您在最短的时间内找到最短的答案:

  1. 使用您的字符集构建trie
  2. 从根节点进行广度优先搜索,第一个遇到的空节点将是最短的答案。
  3. 优化实现的时间复杂度为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);