鱼C论坛

 找回密码
 立即注册
查看: 3194|回复: 1

后缀数组匹配字符串的问题

[复制链接]
发表于 2021-2-24 21:45:47 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
小弟在学习后缀数组匹配字符串的时候遇到一个问题,后缀数组的求法我会求了,这个地方没有疑问,我的疑问在利用后缀数组进行匹配的时候。
例如源串s="babababab",待匹配串p="ba",我学习到的代码是利用二分查找来进行匹配,我的代码可以实现正确的查找功能,可是当p在s中有多个地方可以匹配的时候,它只能输出其中的一次,请问这就是利用后缀数组进行字符串匹配的缺陷吗?
  1. import java.util.*;

  2. public class Main {

  3.         public static void main(String[] args) {
  4.                 // TODO Auto-generated method stub
  5.                 String s="babababab";
  6.                 String p="ba";
  7.                 Suff sa[]=getSa(s);
  8.                 for (int i = 0; i < sa.length; i++) {
  9.                         System.out.println(sa[i].toString());
  10.                 }
  11.                 int resIndex=getRes(p,sa,0,s.length()-1);
  12.                 System.out.println(resIndex);
  13.         }

  14.        

  15.         private static int getRes(String p, Suff[] sa, int start, int end) {
  16.                 // TODO Auto-generated method stub
  17.                 int mid=start+((end-start)>>1);
  18.                 if(start>end) {
  19.                         return -1;
  20.                 }
  21.                 if(sa[mid].str.length()>=p.length()&&(sa[mid].str.substring(0, p.length()).compareTo(p)==0)) {
  22. //                        if(sa[mid].str.compareTo(p)>0) {
  23. //                                return getRes(p, sa, start, mid-1);
  24. //                        }
  25.                         return sa[mid].index;
  26.                 }
  27.                 if(p.compareTo(sa[mid].str)<0) {  //若p<sa[mid].str会返回一个负数
  28.                         return getRes(p, sa, start, mid-1);
  29.                 }
  30.                 else if(p.compareTo(sa[mid].str)>0) {
  31.                         return getRes(p, sa, mid+1, end);
  32.                 }
  33.                 else {
  34.                         return sa[mid].index;
  35.                 }
  36.                
  37.         }



  38.         private static Suff[] getSa(String s) {
  39.                 // TODO Auto-generated method stub
  40.                 Suff sa[]=new Suff[s.length()];
  41.                 for (int i = 0; i < s.length(); i++) {
  42.                         String temp=s.substring(i);
  43.                         sa[i]=new Suff(temp,i);
  44.                 }
  45.                 Arrays.sort(sa);
  46.                 return sa;
  47.         }
  48.         //记得这里要加static
  49.         public static class Suff implements Comparable<Suff> { // 意思是必须自己重新实现Comparable的意思
  50.                 String str;
  51.                 int index;

  52.                 public Suff(String str, int index) {
  53.                         this.str = str;
  54.                         this.index = index;
  55.                 }

  56.                 public int compareTo(Suff o2) {
  57.                         return this.str.compareTo(o2.str);
  58.                 }
  59.                
  60.                 public String toString() {
  61.                         return "Suff:"+this.str+" "+"index:"+this.index;
  62.                 }

  63.         }

  64. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-2-24 21:46:32 | 显示全部楼层
当输入我这个的p和s时,控制台输出为4
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-19 11:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表