【发布时间】:2021-08-22 04:15:00
【问题描述】:
给定两个字符串 s1 和 s2,我们必须检查 s2 是否是 s1 的子字符串。 如果是真的打印“真”,否则打印“假” 但是 s1 和 s2 可以包含像 '*' 和 '\' 这样的字符。 在 s2 中,“*”表示两个字母之间的零个或多个字符,“\”表示“*”的转义序列。 在 s1 中,'*' 和 '\' 只是要检查的其他字符。
示例输入和输出:
Input: abcd , a*c Output: true
Input : spoon , sp*n Output : true
Input : regex , re*g Output : true
Input : search , *c Output : true
Input : zoho , *o*o Output : true
Input : zoho , *ogo Output : false
Input : test , pest Output : false
Input : st*r , t\*r Output : true
Input : star , t\*r Output false
Input : tree , tr\ Output false
Input : tr\e , tr\ Output true
我知道这个问题可以通过使用 regex 轻松解决,但是我需要一个合乎逻辑的方法来解决这个问题。有人能尽快帮助我吗? 以下是我尝试过但无法完全解决的代码。
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
String s1 = sc.next();
String s2 = sc.next();
boolean flag = true;
int i=0,j=0;
for(;s2.charAt(j)<'a' || s2.charAt(j)>'z';j++);
for(i=0;i<s1.length();i++)
{
char ch = s1.charAt(i);
if(ch==s2.charAt(j))
{
i++;j++;
break;
}
}
for(;j<s2.length();)
{
System.out.println(i+" "+j);
while(s2.charAt(j)=='*' && j<s2.length()-1 && s2.charAt(j+1)!=s1.charAt(i) && i<s1.length())
{
i++;
}
j++;
if(i==s1.length())
{
flag = false;
break;
}
if(s1.charAt(i)!=s2.charAt(j) && s2.charAt(j)<97 && s2.charAt(j)>122)
{
flag = false;
break;
}
}
System.out.print(flag);
}
【问题讨论】:
-
做正则表达式不是逻辑的事情吗?
-
这是面试中提出的问题。他们不需要我通过使用正则表达式来解决这个问题。否则,我同意,正则表达式也是合乎逻辑的。
标签: java regex string substring