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