字符串模式匹配,后缀数组可以解决这个还是有更多解决方案?

时间:2012-02-22 10:02:24

标签: algorithm suffix-array

我有一个由特殊字符(B,C,D,F,X,Z)随机生成的字符串,例如用于生成以下字符串列表:

B D Z Z Z C D C Z
B D C
B Z Z Z D X 
D B Z F
Z B D C C Z
B D C F Z
..........

我还有一个模式列表,即匹配生成字符串并返回最佳模式并从字符串中提取一些字符串。

字符串模式

B D C [D must appear before the C >> DC]
B C F
B D C F
B X [if string have X,must be matched.]
.......

例如,

B D Z Z Z C D C ZBDC,可以匹配B D C

D B Z C F,其中包含BC以及F,因此可以B C F匹配

D B Z D FBF,可以匹配B F

.......

现在,我只想到suffix array

1.首先将字符串转换为后缀数组对象。

2.遍历每个模式,找到可以匹配的后缀数组。

3.比较所有匹配的模式并获得最佳模式。

var suffix_array=Convert a string to suffix array.
var list=new List();
for (int i=0;i<pattern length;i++){
    if (suffix_array.match(pattern))
        list.Add(pattern);
}
var max=list[0];
for (int i=1;i<list.length;i++){
{
   if (list[i]>max)
      max=list[i];
      Write(list[i]);
}

我只是觉得这个方法很复杂,需要为模式构建一个树,并把它与后缀array.who有更多的想法匹配?

====================更新

我现在得到了一个最好的解决方案,我创建了一个新类,它具有B,C,D,X ...的属性,即数组类型.each属性保存出现在字符串处的位置。 现在,如果B没有出现在字符串中,我们可以立即结束这个处理。 我们也可以得到所有的C和D位置,然后比较它是否可以顺序出现(DC,DCC,CCC ....)

2 个答案:

答案 0 :(得分:0)

我不确定您使用的是哪种编程语言;你用正则表达式检查了它的功能吗?如果您不熟悉这些,那么您应该点击谷歌。

答案 1 :(得分:0)

var suffix_array=Convert a string to suffix array.
var best=(worst value - presumably zero - pattern);
for (int i=0;i<pattern list array length;i++){
  if (suffix_array.match(pattern[i])){
    if(pattern[i]>best){
      best=pattern[i];
    }
    (add pattern[i] to list here if you still want a list of all matches)
  }
}
write best;

粗略地说,无论如何,如果我理解你正在寻找的东西,虽然我确信可能会有更好的解决方案,但这是一个小小的改进。