zoukankan      html  css  js  c++  java
  • 字符串匹配

    BF,KMP,BM

    先不说这些,java里都有哪些实现呢?

     1 package yxy;
     2 
     3 import java.util.regex.Pattern;
     4 
     5 /**
     6  * @author crane
     7  * 字符串匹配
     8  */
     9 public class ZiFuChuanPiPei {
    10 
    11     public static void main(String[] args) {
    12         // TODO Auto-generated method stub
    13         String str="I'm crane";
    14         String subStr1="crane";
    15         String subStr2="hello";
    16         System.out.println("str : "+str);
    17         System.out.println("subStr1 : "+subStr1);
    18         System.out.println("subStr2 : "+subStr2);
    19         //方法1 boolean contains(CharSequence s) 当且仅当此字符串包含指定的 char 值序列时,返回 true
    20         System.out.println("str.contains(subStr1) : "+str.contains(subStr1));   
    21         System.out.println("str.contains(subStr2) : "+str.contains(subStr2));
    22         //方法2 int indexOf(String str) 返回指定子字符串在此字符串中第一次出现处的索引
    23         System.out.println("str.indexOf(subStr1) : "+str.indexOf(subStr1));   
    24         System.out.println("str.indexOf(subStr2) : "+str.indexOf(subStr2));
    25         //方法3 boolean matches(String regex)  告知此字符串是否匹配给定的正则表达式
    26         String regex1=".*"+subStr1+".*";
    27         String regex2=".*"+subStr2+".*";
    28         System.out.println("str.matches(regex1) : "+str.matches(regex1));
    29         System.out.println("str.matches(regex2) : "+str.matches(regex2));
    30         //方法四  java.util.regex包中提供的类 使用方法查看JDK API
    31         System.out.println("Pattern.matches(regex1, str) : "+Pattern.matches(regex1, str));//注意:这里是regex而不是String
    32         System.out.println("Pattern.matches(regex2, str) : "+Pattern.matches(regex2, str));
    33     }
    34 
    35 }
    View Code

    运行结果:

    str : I'm crane
    subStr1 : crane
    subStr2 : hello
    str.contains(subStr1) : true
    str.contains(subStr2) : false
    str.indexOf(subStr1) : 4
    str.indexOf(subStr2) : -1
    str.matches(regex1) : true
    str.matches(regex2) : false
    Pattern.matches(regex1, str) : true
    Pattern.matches(regex2, str) : false
    View Code

     查看JDK1.6的源码发现(我在eclipse中安装了jd-eclipse插件,反编译用的,查看源码很方便的)

      public boolean contains(CharSequence paramCharSequence)
      {
        return indexOf(paramCharSequence.toString()) > -1;
      }

    即contains调用了indexOf

     1 package yxy;
     2 
     3 import java.util.regex.Pattern;
     4 
     5 /**
     6  * @author crane
     7  * 字符串匹配
     8  */
     9 public class ZiFuChuanPiPei {
    10 
    11     //BF
    12     static boolean isMatch(char[] text,char[] pattern){
    13         if(text==null||pattern==null)
    14             return false;
    15         int tLength=text.length,pLength=pattern.length;
    16         if(tLength<pLength)
    17             return false;
    18         int i=0,j=0,k=0;    //i,j分别指向文本和模式比较时的字符下标,k记录文本比较时开始的下标,便于回退
    19         while(i<=tLength-pLength){    //这个不好想的话,想象pattern的长度为1,就容易理解了
    20             k=i;
    21             //while(pattern[j]==text[i]&&j<pLength){    
    22             //j<pLength是因为不能比较pattern的结束符,额,C语言里边是那样,java 里面是吗?
    23             //http://blog.csdn.net/easy_gemini/article/details/8226123 
    24             while(i<=tLength-pLength&&j<pLength&&pattern[j]==text[i]){
    25                 j++;
    26                 i++;
    27             }
    28             if(j==pLength){
    29                 return true;
    30             }else{    //回溯
    31                 j=0;
    32                 i=k+1;
    33             }
    34         }
    35         return false;
    36     }
    37     
    38     static boolean isMatch(String text,String pattern){
    39         if(text==null||pattern==null)
    40             return false;
    41         int tLength=text.length(),pLength=pattern.length();
    42         if(tLength<pLength)
    43             return false;
    44         int i=0,j=0,k=0;    //i,j分别指向文本和模式比较时的字符下标,k记录文本比较时开始的下标,便于回退
    45         while(i<=tLength-pLength){    //这个不好想的话,想象pattern的长度为1,就容易理解了
    46             k=i;
    47             //while(pattern[j]==text[i]&&j<pLength){    
    48             //j<pLength是因为不能比较pattern的结束符,额,C语言里边是那样,java 里面是吗?
    49             //http://blog.csdn.net/easy_gemini/article/details/8226123 
    50             while(i<=tLength-pLength&&j<pLength&&pattern.charAt(j)==text.charAt(i)){
    51                 j++;
    52                 i++;
    53             }
    54             if(j==pLength){
    55                 return true;
    56             }else{    //回溯
    57                 j=0;
    58                 i=k+1;
    59             }
    60         }
    61         return false;
    62     }
    63     
    64     public static void main(String[] args) {
    65         // TODO Auto-generated method stub
    66         String text="I'm crane";
    67         String pattern1="crane";
    68         String pattern2="hello";
    69         System.out.println(isMatch(text.toCharArray(),pattern1.toCharArray()));
    70         System.out.println(isMatch(text.toCharArray(),pattern2.toCharArray()));
    71         System.out.println(isMatch(text,pattern1));
    72         System.out.println(isMatch(text,pattern2));
    73     }
    74 
    75 }

    运行结果:

    false
    false
    false
    false

    代码不对,错在24行和50行的

    i<=tLength-pLength

     这样的话,没次到这里就不再继续比较了,所以不对

    改为:i<tLength 就对了。

  • 相关阅读:
    BZOJ4269: 再见Xor(线性基)
    Codeforces Round #473 (Div. 2)
    洛谷P3812 【模板】线性基
    CodeChef March Lunchtime 2018 div2
    BZOJ1023: [SHOI2008]cactus仙人掌图(仙人掌dp)
    【Android】Android布局中实现圆角边框
    Java学习系列(一)Java的运行机制、JDK的安装配置及常用命令详解
    mac OSX上eclipse adb无法识别(调试)小米的解决方案
    IOS回调机制——代理,通知中心以及Block
    长沙国储电脑城-学生买电脑-被坑记
  • 原文地址:https://www.cnblogs.com/crane-practice/p/3675658.html
Copyright © 2011-2022 走看看