【剑指offer】字符串专题:正则匹配/字符流判断

一、正则表达式匹配

在这里插入图片描述
分析:正则表达式类型的题,主要在于理清一层层的逻辑。


import java.util.Arrays;

/*
    首先,考虑特殊情况:
         1>两个字符串都为空,返回true
         2>当第一个字符串不空,而第二个字符串空了,返回false(因为这样,就无法
            匹配成功了,而如果第一个字符串空了,第二个字符串非空,还是可能匹配成
            功的,比如第二个字符串是“a*a*a*a*”,由于‘*’之前的元素可以出现0次,
            所以有可能匹配成功)
    之后就开始匹配第一个字符,这里有两种可能:匹配成功或匹配失败。但考虑到pattern
    下一个字符可能是‘*’, 这里我们分两种情况讨论:pattern下一个字符为‘*’或
    不为‘*’:
          1>pattern下一个字符不为‘*’:这种情况比较简单,直接匹配当前字符。如果
            匹配成功,继续匹配下一个;如果匹配失败,直接返回false。注意这里的
            “匹配成功”,除了两个字符相同的情况外,还有一种情况,就是pattern的
            当前字符为‘.’,同时str的当前字符不为‘\0’。
          2>pattern下一个字符为‘*’时,稍微复杂一些,因为‘*’可以代表0个或多个。
            这里把这些情况都考虑到:
               a>当‘*’匹配0个字符时,str当前字符不变,pattern当前字符后移两位,
                跳过这个‘*’符号;
               b>当‘*’匹配1个或多个时,str当前字符移向下一个,pattern当前字符
                不变。(这里匹配1个或多个可以看成一种情况,因为:当匹配一个时,
                由于str移到了下一个字符,而pattern字符不变,就回到了上边的情况a;
                当匹配多于一个字符时,相当于从str的下一个字符继续开始匹配)
    之后再写代码就很简单了。
*/
public class match {
    private int i = 0;
    private int j = 0;

    public boolean match(char[] str, char[] pattern)
    {
        if((str==null||str.length==0)&&(pattern==null||pattern.length==0))
            return true;
        else if(str!=null&&(pattern==null||pattern.length==0))
            return false;
        if(j+1==pattern.length||pattern[j+1]!='*'){
            //pattern下一个字符不为‘*’时
            if(str!=null&&i<str.length){
                if(pattern[j]==str[i]||pattern[j]=='.')
                    return match(Arrays.copyOfRange(str,i+1,str.length),Arrays.copyOfRange(pattern,j+1,pattern.length));
                else
                    return false;

            }
            else
                return false;
        }
        else {
            //pattern下一个字符为‘*’时
            if(str!=null&&i<str.length&&(pattern[j]==str[i]||pattern[j]=='.'))
                return match(Arrays.copyOfRange(str,i+1,str.length),pattern)||match(str,Arrays.copyOfRange(pattern,j+2,pattern.length));
            else
                return match(str,Arrays.copyOfRange(pattern,j+2,pattern.length));

        }
    }
}

二、字符流中第一个不重复的字符

在这里插入图片描述
分析:

  1. 利用hash的思想,ASCII字符最多也就128个,所以用一个大小为128的char数组记录每一个字符出现的次数
  2. 容易发现,字符流中不重复的字符可能同时存在多个,我们只要把这些 “不重复字符” 保存起来就可以,而无需保存那些重复出现的字符,而为了维护字符出现的顺序,我们使用队列(先进先出)这一结构,先出现的不重复字符先输出
public class charFlow {
    char[] charCnt = new char[128];
    Queue<Character> queue = new LinkedList<>();

    //Insert one char from stringstream
    public void Insert(char ch)
    {
        if(charCnt[ch] == 0){
            charCnt[ch]++;
            queue.offer(ch);
        }
        else
            charCnt[ch]++;
    }
    //return the first appearence once char in current stringstream
    public char FirstAppearingOnce()
    {
        while (!queue.isEmpty()){
            if(charCnt[queue.peek()]>1){
                queue.poll();
            }
            else
                return queue.peek();
        }
        return '#';
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值