题目描述
对于字符串str,其中绝对不含有字符’.’和‘*’。再给定字符串exp,其中可以含有’.’或’‘*’,’*’字符不能是exp的首字符,并且任意两个’*‘字符不相邻。exp中的’.’代表任何一个字符,exp中的’*’表示’*‘的前一个字符可以有0个或者多个。请写一个函数,判断str是否能被exp匹配(注意:输入的数据不保证合法,但只含小写字母和‘.’和‘*’)。
package test;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String s = scanner.next();
String exp = scanner.next();
scanner.close();
System.out.println(solution(s, exp));
}
private static String solution(String s, String exp) {
if (!checkValid(exp)) return "NO";
int i = 0, j = 0;
while (i < s.length() && j < exp.length())
{
if (exp.charAt(j) == '.')///1111111111111.只代表一个字符,两个都要右移动1位。
{
i++;
j++;
}
else if (exp.charAt(j) == '*')///2222222222222222 有*号的情况
{
if(j == exp.length()-1)///最后一个位为*号
return "YES";
//匹配后一个
if (j + 1 < exp.length())
{
//可以匹配
while (exp.charAt(j + 1) != s.charAt(i))
{
if (i < s.length())
{
i++;
}
//匹配完了
if (i == s.length())
{
if(j == exp.length()-1)///最后一个为*号
{
return "YES";
}
else
{
return "NO";
}
}
}
{
//未匹配完,正则向前移动
j++;
}
}
}
else
{ ///33333333333333333 直接比较字母,两个字符串的位置都直接加1
if (s.charAt(i) != exp.charAt(j))
return "NO";
i++;
j++;
}
}
if (i == s.length() && j == exp.length())
return "YES";
return "NO";
}
public static boolean checkValid(String exp)
{
if (exp==null||exp.length()==0) return false;
if (exp.charAt(0) == '*') return false;
if(exp.contains("**"))
{
return false;
}
return true;
}
}