1.質問分析
'.'
およびなどの'*'
正規表現に一致する関数を実装してください。
パターン内の文字は'.'
任意の文字を表し、'*'
その前の文字は任意の回数(0回を含む)出現できます。
この質問では、一致とは、文字列のすべての文字がパターン全体と一致することを意味します。たとえば、文字列「AAA」とパターン"a.a"
と"ab*ac*a"
一致しますが、と"aa.a"
とは"ab*a"
一致しません
この質問は主に、パターンの2番目の文字が*
これに基づいて、状況を詳細に説明します。
(1)パターンの2番目の文字が次の場合*
:
文字列の最初の文字がパターンの最初の文字と一致する場合、文字列とパターンの両方が1文字後ろにシフトされ、残りの文字が一致します。
文字列の最初の文字がパターンの最初の文字と一致しない場合、直接falseを返す
(2)パターンの2番目の文字が次の場合*
:
文字列の最初の文字がパターンの最初の文字と一致しない場合、パターンは2文字分シフトされて一致し続けます。
文字列の最初の文字がパターンの最初の文字と一致する場合、3つの一致方法があります。
- モードが2文字シフトした後、
X*
無視されるのと同等- 文字列は1文字後ろに移動し、パターンは2文字後ろに移動します
- 文字列は1文字後ろに移動し、パターンは変更されないままです。その後、*は複数の数字に一致する可能性があるため、次の文字が引き続き一致します。
第二に、コード
/**
* @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;
}
}
三、まとめ
主な問題は、2番目の*
プロセスとその後の決定です。