Artigo Diretório
1. Análise da questão
Implemente uma função para corresponder às expressões regulares, incluindo '.'
e '*'
.
O caractere no padrão '.'
representa qualquer caractere e '*'
o caractere antes dele pode aparecer qualquer número de vezes (incluindo 0 vezes).
Nesta questão, correspondência significa que todos os caracteres da string correspondem a todo o padrão. Por exemplo, a string "aaa" e o padrão "a.a"
e "ab*ac*a"
correspondem, mas com "aa.a"
e "ab*a"
não correspondem
Esta questão é principalmente para determinar se o segundo personagem no padrão*
Com base nisso, discutiremos a situação em detalhes:
(1) Quando o segundo caractere no padrão não é *
:
Se o primeiro caractere da string corresponder ao primeiro caractere do padrão, a string e o padrão serão deslocados em um caractere e os caracteres restantes serão correspondidos.
Se o primeiro caractere da string não corresponder ao primeiro caractere do padrão Retornar falso diretamente
(2) Quando o segundo caractere no padrão é *
:
Se o primeiro caractere da string não corresponder ao primeiro caractere do padrão, o padrão será alterado em 2 caracteres e continuará a corresponder.
Se o primeiro caractere da string corresponder ao primeiro caractere do padrão, existem 3 métodos de correspondência:
- Após a mudança de modo de dois caracteres, o equivalente a
X*
ser ignorado- A string é movida para trás em 1 caractere e o padrão é movido para trás em 2 caracteres
- A string é movida para trás em um caractere e o padrão permanece inalterado, então o próximo caractere continuará a ser correspondido, porque * pode corresponder a vários dígitos
Em segundo lugar, o código
/**
* @Auther: Yolo
* @Date: 2020/9/10 08:49
* @Description:
*/
public class Test_10 {
public static void main(String[] args) {
char[] str = {
};
char[] pattern = {
};
boolean result = match(str, pattern);
System.out.println(result);
}
private static boolean match(char[] str, char[] pattern) {
if (str == null || pattern == null) {
return false;
}
int strIndex = 0;
int patternIndex = 0;
return matchCore(str, strIndex, pattern, patternIndex);
}
private static boolean matchCore(char[] str, int strIndex, char[] pattern, int patternIndex) {
//有效性检验,str 到尾,pattern 到尾匹配成功
if (strIndex == str.length && patternIndex == pattern.length) {
return true;
}
//pattern 先到尾,匹配失败
if (strIndex != str.length && patternIndex == pattern.length) {
return false;
}
//模式第二个是 '*',且字符串第一个跟模式第一个匹配,分三种匹配;如果不匹配,模式后移两位
if (patternIndex + 1 < pattern.length && pattern[patternIndex + 1] == '*') {
if (strIndex != str.length && (pattern[patternIndex] == str[strIndex] || pattern[patternIndex] == '.')) {
return matchCore(str, strIndex, pattern, patternIndex + 2)
|| matchCore(str, strIndex + 1, pattern, patternIndex + 2)
|| matchCore(str, strIndex + 1, pattern, patternIndex);
} else {
//模式后移两位,相当于 x* 被忽略
return matchCore(str, strIndex, pattern, patternIndex + 2);
}
}
//模式第二个不是 '*',且字符串第一个跟模式第一个匹配,则都后移一维,否则直接返回 false
if (strIndex != str.length && (pattern[patternIndex] == str[strIndex] || pattern[patternIndex] == '.')) {
return matchCore(str, strIndex + 1, pattern, patternIndex + 1);
}
return false;
}
}
Três, resumo
A questão principal é o segundo *
processo e a posterior determinação de