zoukankan      html  css  js  c++  java
  • 正则表达式匹配

     1 package algorithms;
     2 
     3 /**
     4  * 请实现一个函数用来匹配包括'.'和'*'的正则表达式。 模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。
     5  * 在本题中,匹配是指字符串的所有字符匹配整个模式。 例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配
     6  * 
     7  * 
     8  **/
     9 
    10 public class StringMatch {
    11     public boolean match(char[] str, char[] pattern) {
    12         return matchCore(str, 0, pattern, 0);
    13     }
    14 
    15     public boolean matchCore(char[] str, int i, char[] pattern, int j) {
    16         if (i >= str.length && j >= pattern.length) {
    17             return true;
    18         }
    19         if (i != str.length - 1 && j == pattern.length - 1)
    20             return false;
    21         // 一种较为复杂的情况 即模式的字符后面一个字符为*
    22         if (j < pattern.length - 1 && pattern[j + 1] == '*') {
    23             // 如果两者当前能够匹配上 模式有两种选择
    24             // 一是向后移动两个字符 二是原地不动
    25             // 如果当成匹配上字符串也需要向后移动一个字符
    26             if (i < str.length && (pattern[j] == str[i] || (pattern[j] == '.' && i < str.length))) {
    27                 return matchCore(str, i + 1, pattern, j + 2) || matchCore(str, i + 1, pattern, j)
    28                         || matchCore(str, i, pattern, j + 2);
    29             } else
    30                 return matchCore(str, i, pattern, j + 2);
    31 
    32         }
    33         // 如果模式的字符后一个不是*时,该情况较为简单 直接比较即可
    34         if (i < str.length && j < pattern.length && (str[i] == pattern[j] || (pattern[j] == '.' && i < str.length)))
    35             return matchCore(str, i + 1, pattern, j + 1);
    36         return false;
    37     }
    38 
    39     public static void main(String[] args) {
    40         char[] str = { 'a', 'a' };
    41         char[] pattern = { 'a', '*' };
    42         StringMatch ma = new StringMatch();
    43         System.out.println(ma.match(str, pattern));
    44     }
    45 }
  • 相关阅读:
    [算法] 堆栈
    [刷题] PTA 02-线性结构3 Reversing Linked List
    java IO流 (八) RandomAccessFile的使用
    java IO流 (七) 对象流的使用
    java IO流 (六) 其它的流的使用
    java IO流 (五) 转换流的使用 以及编码集
    java IO流 (四) 缓冲流的使用
    java IO流 (三) 节点流(或文件流)
    java IO流 (二) IO流概述
    java IO流 (一) File类的使用
  • 原文地址:https://www.cnblogs.com/ustc-anmin/p/10618490.html
Copyright © 2011-2022 走看看