如果A *有效,则检查的简单算法

时间:2016-01-26 02:52:19

标签: algorithm

设A是一组字符串 设A *是由A

中的元素组合构成的字符串

检查A *是否由A

元素组成的简单算法是什么

A = {a,b,c,de}

A * = acbbde

如何检查A *是否有效?

1 个答案:

答案 0 :(得分:0)

有很多方法。设n为字符中(长)字符串的大小。这里几个例子:

a)如果元素是您的意思是字符(A={a,b,c,d,e}而不是A={a,b,c,de}

  1. 排序A,A*升序

    这可以在O(n.log(n))中完成,或者如果您在O(n)中使用存储桶排序。

  2. 测试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 ++代码未经测试(只是让你明白我的意思)。如果AA*为空,则结果ret将为false,因此如果您需要true通过初始化ret=1来处理该情况。< / p>

  3. b)直方图

    1. A,A*

      执行有序直方图

      将计数饱和为1.因此,概率仅为01;

    2. 比较直方图

      a)#2

    3. 中的方式类似

      c)蛮力

      只需A*中的每个元素搜索A中是否存在此元素。这导致2个嵌套循环O(n^2)m的大小为A,然后O(n.m)

      <强> [注释]

      如果A的元素是字符串,那么您需要按大小递减对它们进行排序。然后首先搜索最长的字符串,最短的字符串,否则你可能错误匹配的东西。如果某些元素是其他元素的前缀,也可能会遇到问题。如果您想在这种情况下使用a),b),则需要以这种方式将A*重新索引到字符。 (用A中的索引替换元素)