ac算法 java_JAVA AC自动机算法,后缀自动机?

ArbrePrefixes(Iterable s) throws FileNotFoundException{

racine=new Noeud('.',null,false);//racine = 根

Iterator iter = s.iterator();

while(iter.hasNext()){

Scanner buffer = new Scanner(iter.next());//new file

buffer.useDelimiter("");

Character symboleLu;

Noeud pere = this.racine;

boolean prefixe=false;

while (buffer.hasNext()) {

symboleLu = buffer.next().charAt(0);

if(!buffer.hasNext()){prefixe=true;}

CreerFilsManquant(pere,symboleLu,prefixe);

pere=pere.listeFils.get(symboleLu);}//pere=父节点

buffer.close();

}}

//找后缀

public void trouverSuffixe(){

if(this==racine){

noeudCandidat=racine;

}

else{

noeudCandidat = this.pere.suffixe;

}

while(true){

if (noeudCandidat.listeFils.get(this.caractere)!=null && noeudCandidat.listeFils.get(this.caractere)!=this){

suffixe=noeudCandidat.listeFils.get(this.caractere);

}

if(suffixe!=null){break;}

else{

if(noeudCandidat.pere == null){

suffixe=racine;

}

else{

noeudCandidat=noeudCandidat.pere;

}

}

}

}

//找符合的后缀

public void trouverSuffixeAcceptant(){

if(suffixe.prefixeMotDico){

suffixeAcceptant=suffixe;

}

else{

suffixeAcceptant=suffixe.suffixeAcceptant;

}

if(suffixeAcceptant==null){

suffixeAcceptant=racine;

}}

public void VerifierOccurence(){

try {

URL url = AhoCorasick.class.getClassLoader().getResource("");

Iterator it = ConstruitDictionnaire(url.getFile()+"CyranoDeBergerac.txt").iterator();

Noeud noeudEnCours=racine;

Noeud noeudSuffixe;

int compteur = 0;

while(it.hasNext()){

String mot = it.next();

Scanner buffer = new Scanner(mot);//new file

buffer.useDelimiter("");

Character symboleLu;

//char[] ch = mot.toCharArray();

while (buffer.hasNext()) {

compteur ++;

symboleLu =buffer.next().charAt(0);

Character tiret=new Character('-');

if((Character.isLetter(symboleLu))||(symboleLu.equals(tiret)))

{

if(noeudEnCours!=null && noeudEnCours.listeFils.get(symboleLu)!=null){

noeudEnCours=noeudEnCours.listeFils.get(symboleLu);

if (noeudEnCours.prefixeMotDico){

Occurence occ = new Occurence(mot,compteur);

System.out.println("--nouedSuffixe=racine-------"+compteur);

}

noeudSuffixe=noeudEnCours.suffixeAcceptant;

while(noeudSuffixe !=racine){

Occurence occ = new Occurence(mot, compteur);

System.out.println("---noeudSuffixe------"+compteur);

noeudEnCours=noeudSuffixe;

noeudSuffixe=noeudSuffixe.suffixeAcceptant;

}

}

else{

noeudEnCours=racine.listeFils.get(symboleLu);

if(noeudEnCours != null) noeudEnCours.Afficher();

}}}

buffer.close();

}

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}}

主要是VerifierOccurence这个函数来运行main。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值