设A是一组字符串 设A *是由A
中的元素组合构成的字符串检查A *是否由A
元素组成的简单算法是什么离
A = {a,b,c,de}
A * = acbbde
如何检查A *是否有效?
答案 0 :(得分:0)
有很多方法。设n
为字符中(长)字符串的大小。这里几个例子:
a)如果元素是您的意思是字符(A={a,b,c,d,e}
而不是A={a,b,c,de}
)
排序A,A*
升序
这可以在O(n.log(n))
中完成,或者如果您在O(n)
中使用存储桶排序。
测试A*
的所有字符是否在A
这可以通过简单的for O(n)
中的两个索引来完成:
char A[]="abcde\0",B[]="abbcde\0"; // input
for (int a=0,b=0,ret=0;(A[a])&&(B[b]);) // loop through both A,A*
{
while((A[a]<B[b])&&(A[a])) a++; // step in A
if (A[a]!=B[b]) { ret=0; break; } // A* is not made from A
else ret=1; // A* is made from A
b++;
}
// here ret holds the result
C ++代码未经测试(只是让你明白我的意思)。如果A
或A*
为空,则结果ret
将为false
,因此如果您需要true
通过初始化ret=1
来处理该情况。< / p>
b)直方图
为A,A*
将计数饱和为1.因此,概率仅为0
或1
;
比较直方图
与 a)#2
c)蛮力
只需A*
中的每个元素搜索A
中是否存在此元素。这导致2个嵌套循环O(n^2)
或m
的大小为A
,然后O(n.m)
<强> [注释] 强>
如果A
的元素是字符串,那么您需要按大小递减对它们进行排序。然后首先搜索最长的字符串,最短的字符串,否则你可能错误匹配的东西。如果某些元素是其他元素的前缀,也可能会遇到问题。如果您想在这种情况下使用a),b)
,则需要以这种方式将A*
重新索引到字符。 (用A
中的索引替换元素)