我正在通过KMP算法。虽然这个算法很清楚,但我有一个疑问。
前缀表算法:
void prefixTable(char p[], int m){
int i=1, j=0, F[0] = 0;
while(i<m){
if(p[i]==p[j]){
F[i]=j+1;
i++;
j++;
}else if(j>0){
j=F[j-1];
}else{
F[i]=0;
i++;
}
}
}
如上图像步骤5所示,i = 5,j = 3,j = F [j-1]被执行为j> 0。
我们为什么要选择F [j-1]?为什么我们不能直接使用F [0]? 它如何确保算法的正确性?
答案 0 :(得分:2)
j是模式中的位置。
如果图案被处理到某个位置&gt; 0,那么如果模式包含自身的前缀,我们就不能将模式转移到第一个(0)位置。
应用于您的示例:模式为 override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("myCell") as! cellController
let ciljZaPrikaz = listaObjekata[indexPath.item]
cell.labelText.text = ciljZaPrikaz.imeCilja ?? "no text found"
let path = getDocumentsDirectory().stringByAppendingPathComponent(ciljZaPrikaz.slikaCilja)
cell.imageToShow.image = UIImage(contentsOfFile: path)
return cell
}
。尝试在文字ababaca
中找到它:
abababaca
模式为ababa|baca
ababa|c
的{{1}}(请注意,我不会更改)|ababac
,其匹配baca
aba|bac
,状态为baca
,并且显示找到的模式为ababac|