一、正则表达式匹配
分析:正则表达式类型的题,主要在于理清一层层的逻辑。
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));
}
}
}
二、字符流中第一个不重复的字符
分析:
- 利用hash的思想,ASCII字符最多也就128个,所以用一个大小为128的char数组记录每一个字符出现的次数
- 容易发现,字符流中不重复的字符可能同时存在多个,我们只要把这些 “不重复字符” 保存起来就可以,而无需保存那些重复出现的字符,而为了维护字符出现的顺序,我们使用队列(先进先出)这一结构,先出现的不重复字符先输出
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 '#';
}
}