Chinaunix首页 | 论坛 | 博客
  • 博客访问: 442762
  • 博文数量: 78
  • 博客积分: 2307
  • 博客等级: 上尉
  • 技术积分: 920
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-04 00:31
个人简介

IT老鸟,信息安全硕士。

文章分类
文章存档

2017年(2)

2012年(21)

2011年(55)

分类: Java

2011-07-11 17:43:22

关于字符串匹配有很多方法.不过那些方法速度都很慢,最让人受不了的是很多算法比蛮力还要慢.包括kmp算法.上个月读书读到了字符串匹配的书.正好这个月要用.我就写了一个出来.最坏时间复杂度是2n.n表示文本的长度.
匹配的方法是后缀匹配.后缀匹配比前缀比较的次数更少.另外采用滑动的方式.可以精确的跳转.无关的直接跳过.有关的会依次向后滑动.
这个方法是已知的最快方法之一.另外还有位并行什么的用java就太麻烦了.这个用硬件差不多.
搜索文本中字符串的位置.是从0开始的
  1. /**
  2. * 搜索字符串.如果搜索出来返回字母的位置
  3. * -1表示没搜索出来
  4. * @param str表示搜索的字符串
  5. * @param fileContents表示正文
  6. * @return 字符串的初始位置
  7.  * @param start表示从哪里开始.匹配
  8. */
  9. public int StringExist(String str,String fileContents){
  10.         int start=0;
  11.         return 0;//我承认.java的多态和初始化不会玩.
  12.     }
  13. public int StringExist(String str,String fileContents,int start){
  14.         int flag=-1;
  15.         if(str.length()>fileContents.length()&&start>=fileContents.length()) return flag;
  16.         String temp="";
  17.         int j=start,i=0;
  18.         while(j<fileContents.length()){
  19.         temp="";
  20.         i=0;
  21.         for( ;i<str.length();i++){
  22.             if((j+i)<fileContents.length())
  23.             temp+=fileContents.charAt(j+i);
  24.         }
  25.         //j+=i;
  26.         //System.out.println("j="+j);//测试代码
  27.         int n=jump(str,temp);
  28.         if(n!=0){j+=n;}
  29.         else return j;
  30.         }
  31.         return flag;
  32.     }
下面是跳转的部分
  1. /*
  2.      * 跳转的位置
  3.      * 如果返回是0表示匹配中
  4.      */
  5.     private static int jump(String str,String contentstr){
  6.         if(str.length()>contentstr.length()){return contentstr.length();}
  7.         String str1=reversalString(str);
  8.         String contentstr1=reversalString(contentstr);
  9.         int i=0;
  10.         int flag=str1.length();
  11.         boolean semaphore=true;
  12.         for(i=0;i<str.length();i++)
  13.             if(str1.charAt(i)==contentstr1.charAt(i)&&semaphore==true)
  14.                 flag=0;
  15.             else if(str1.charAt(i)==contentstr1.charAt(0)){
  16.                 flag=i;
  17.                 semaphore=false;
  18.                 break;
  19.                 }
  20.             else {
  21.                 semaphore=false;
  22.                 flag=str1.length();
  23.                 }
  24.                 

  25.         return flag;
  26.     }
因为是后缀匹配所以要反转字符串
  1. /**
  2.      * 反转字符串
  3.      * @param str->rts
  4.      * @return
  5.      */
  6.     private static String reversalString(String str){
  7.         String str1="";
  8.         for(int i=str.length()-1;i>=0;i--)
  9.             str1+=str.charAt(i);
  10.         
  11.         return str1;
  12.     }
有了这个就能快速查找文本中是否有指定字符串了.
阅读(2168) | 评论(0) | 转发(0) |
0

上一篇:RSA运算相关资料

下一篇:N皇后Java

给主人留下些什么吧!~~