从字符串中删除模式

时间:2015-02-21 23:20:06

标签: regex string algorithm dynamic-programming

我不确定如何编码。所以,我有一个名为S的字符串和一个名为M的模式字符串。我想删除S中所有出现的M但是,当我在S中删除一个M时,我可能会创建另一个。例如,给出单词“aajjk”和模式“aj”。第一次删除后,它将成为“ajk”。在这个新字符串中,第一次删除后出现了另一次“aj”。所有删除后的最后一个字符串将是“k”。你能给我一些关于如何处理这个问题的技巧,一些伪代码会有所帮助,因为我需要在实现中练习。

3 个答案:

答案 0 :(得分:1)

如果你想要一个最坏情况的线性时间算法,那么一种方法是构造一个接受以M结尾的字符串的有限自动机(例如,Knuth-Morris-Pratt),然后运行这个伪代码。

initialize a state stack to [initial state of the automaton]
initialize an empty character stack
for each character c in S:
    let q be the top of the state stack
    push delta(q, c) onto the state stack,
      where delta is the transition function of the automaton
    push c onto the character stack
    if the top of the state stack is an accepting state:
        pop length(M) values from both stacks
output the contents of the character stack

答案 1 :(得分:0)

在JS中你可以这样做:

function delPattern(patt, str) {
    var res = str.replace(patt, "");
    if(patt.test(res) == true) {
        delPattern(patt, res);
    } else {
        console.log(res);
    }

}

var str = "aajjk"; 
delPattern(/aj/g, str);

" patt" 是模式。在这里" / aj / g "。 " G"代表全球,每个模式都匹配。功能" 替换"用""替换你的模式。在那之后,你问这个模式是否确实存在了一次"我 f(patt.test(res)== true)"。如果是真的,那么同样的事情也是如此。另外,给我结果。

答案 2 :(得分:0)

简单地说,循环只要执行替换就会产生不同的字符串。伪代码:

lastS = null
while(lastS != S)
    lastS = S
    S.replace(M, '')