Каталог статей
1. Анализ вопроса
Пожалуйста, реализуйте функцию для сопоставления регулярных выражений, включая '.'
и '*'
.
Символ в шаблоне '.'
представляет любой символ, а '*'
символ перед ним может появляться любое количество раз (включая 0 раз).
В этом вопросе соответствие означает, что все символы строки соответствуют всему шаблону. Например, строка «ааа» и шаблон "a.a"
и "ab*ac*a"
соответствие, но с "aa.a"
и "ab*a"
не совпадают
Этот вопрос в основном предназначен для того, чтобы определить, является ли второй символ в шаблоне*
Исходя из этого, мы подробно обсудим ситуацию:
(1) Когда второго символа в шаблоне нет *
:
Если первый символ строки совпадает с первым символом в шаблоне, то и строка, и шаблон сдвигаются назад на один символ, а затем сопоставляются оставшиеся символы.
Если первый символ строки не соответствует первому символу в шаблоне, Вернуть false напрямую
(2) Когда второй символ в шаблоне *
:
Если первый символ строки не соответствует первому символу шаблона, шаблон сдвигается на 2 символа и продолжает соответствовать.
Если первый символ строки совпадает с первым символом шаблона, существует 3 метода сопоставления:
- После смены режима на два символа, эквивалент
X*
игнорирования- Строка перемещается назад на 1 символ, а образец перемещается назад на 2 символа.
- Строка перемещается на один символ назад, а шаблон остается неизменным, тогда следующий символ будет продолжать соответствовать, потому что * может соответствовать нескольким цифрам
Во-вторых, код
/**
* @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;
}
}
Три, резюме
Главный вопрос - это второй *
процесс и последующее определение