【问题标题】:string pattern match,the suffix array can solve this or have more solution?字符串模式匹配,后缀数组可以解决这个问题还是有更多的解决方案?
【发布时间】:2012-02-22 10:02:24
【问题描述】:

我有一个由特殊字符(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 Z,有BDC,所以可以匹配B D C

D B Z C F,有BCF,所以可以匹配B C F

D B Z D F,有BF,所以可以匹配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]);
}

我只是觉得这个方法比较复杂,需要为一个模式建立一个树,然后用它来匹配后缀数组。谁有更多的想法?

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

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

【问题讨论】:

  • 您对所有可能的模式感兴趣吗?如果您只想匹配最佳模式,请确定您对最佳模式的定义,例如 B D B C F 可以匹配 BDC 和 BCF。
  • 如果我理解正确,您希望模式“B F”匹配诸如“C B A F”之类的字符串,因为“B”和“F”以“B”的顺序出现在其中,然后F",即使它们的出现并不相邻。我的理解正确吗? (如果是这样,那么找出一个基于后缀数组的算法来解决这个问题将变得非常重要。)
  • 我认为首先要回答的一个关键问题是:您应该索引字符串然后将模式一一应用到它(就像您现在所做的那样),还是应该“索引”模式(进入某种优化的字典,例如搜索树)并将其应用于文本的每个位置?甚至两者兼而有之。要回答这个问题,最好知道有多少模式,它们通常有多长/短/具体/不具体,以及文本可能有多长。
  • @jogojapan,是的,你说得对。我正在通过这种方法做事。我将一个字符及其位置保存到公共数组中,创建一个单独的 C 索引数组。我也创建基于C树结构的规则列表(CD,CC,CCD ....)。结合if....else语句可以解决我的问题。

标签: algorithm suffix-array


【解决方案1】:

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

【讨论】:

  • 正则表达式使用回溯,速度不快。
  • 嗨,感谢您的回复,正则表达式无法解决我的问题,因为生成的字符串大小不固定。
【解决方案2】:
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;

粗略地说,无论如何,如果我了解您在寻找什么,那将是一个轻微的改进,但我确信可能会有更好的解决方案。

【讨论】:

    猜你喜欢
    • 2021-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-15
    • 1970-01-01
    相关资源
    最近更新 更多