如果我有一个字符数组,例如:
A = [w, o, r, n, g, , w, o, r, d]
另一个数组例如:
B = [c, o, r, r, e, c, t, , w, o, r, d, .]
我需要将数组A中的单词(由空格分隔)与数组B进行比较,如果第一个数组中的任何单词存在于第二个数组中,则应该打印该单词。因此,例如,由于“word”存在于第一个数组和第二个数组中,因此应该打印出“word”。
我该怎么做?
答案 0 :(得分:4)
让我们看看我会怎么做:
你需要一个函数,给定一个char
数组,将它分成一个单词数组(并将它们放在C字符串中,NUL请终止:-))。我会把这个数组的长度和数组放在struct
struct WordCollection
{
size_t NumWords;
char **Words;
}
现在......如何做这个功能?
假设我们“欺骗”了一点,并确定我们的数组A
和B
是NUL终止的(或者如果它们.
像B一样终止,那么你替换{{ 1}}与NUL)。现在,这是C,你应该首先计算字符串中的空格数,分配一个.
(char*
)数组,其数量足以包含WordCollection::Words
n + 1
(和将此char*
放入n + 1
)并使用strtok“tokenize”字符串并将字词放入您创建的数组中。
然后您应该(可以)使用此函数将A和B数组拆分为单词。您将获得两个WordCollection::NumWords
,A1和B1。
为了更快,我会qsort B1。
然后对于A1中的每个单词,你{B1}中的bsearch(它不是一个坏单词......它意味着二进制搜索,它是一种在有序数组中搜索内容的快速方法)
完成: - )
我要补充一点,如果这是您第一次使用WordCollection
和bsearch
,那么您最好查看可以找到的样本。他们的语法可能“棘手”。
现在......我知道你不会看代码:-)所以我会把它放在这里
qsort
答案 1 :(得分:1)
基本上你需要以某种方式分离单词,然后迭代组合。有一百种方法可以做到这一点 - 它只需要编程。
答案 2 :(得分:0)
您也可以这样做:
将集合A中的所有单词插入带有后缀“A”的集合C.你会得到=>
worngA
{
{1}}
将集合B中的所有单词插入带有后缀“B”的集合C.你会得到=>
wordA
{
{1}}
在集合C上运行排序算法,例如qsort。你会得到=>
correctB
{
{1}} {
{1}} {
{1}}
在集合C中循环,直到它的大小为1。将wordB
与correctB
进行比较 - 如果它们匹配除了最后一个字母 - 您发现重复并且可以将其打印出来。
我不知道这个算法的复杂性,但它显然应该比对所有单词组合的强力扫描更快: - )