以下函数接受2个字符串,第2个(不是第1个)可能包含*
个(星号)。
*
是字符串的替换(空,1个字符或更多),它可以出现(仅在s2中)一次,两次,更多或根本不显示,它不能与另一个{{1}相邻}(*
),无需检查。
ab**c
如果字符串具有相同的模式,则返回true。
它必须是递归的,不能使用任何循环,静态或全局变量。此外,禁止在String类中使用方法public static boolean samePattern(String s1, String s2)
。可以使用局部变量和方法重载。
只能使用以下方法:equals
,charAt(i)
,substring(i)
,substring(i, j)
。
示例:
length()
我现在被困在这个问题上好几个小时了!我需要Java解决方案,请帮助我。
答案 0 :(得分:5)
答案 1 :(得分:2)
以下是Java中问题的递归,无循环解决方案:
static boolean samePattern(String s1, String s2) {
return
s2.isEmpty() ?
s1.isEmpty()
:
s2.charAt(0) == '*' ?
samePattern(s1, s2.substring(1))
|| (!s1.isEmpty() && samePattern(s1.substring(1), s2))
:
!s1.isEmpty() && s2.charAt(0) == s1.charAt(0) ?
samePattern(s1.substring(1), s2.substring(1))
:
false;
}
public static void main(String[] args) {
String[] patterns = {
"The*xamIs*y", // true
"Th*mIsEasy*", // true
"*", // true
"TheExamIsEasy", // true
"The*IsHard", // false
};
for (String pattern : patterns) {
System.out.println(samePattern("TheExamIsEasy", pattern));
}
}
基本上这里是递归定义:
s2
为空,那么如果samePattern
也为空则为s1
s2
不为空
*
开头,那么它是samePattern
if
samePattern
移除了*
samePattern
,其字符已从s1
中删除(如果有的话)s1
,请检查其余samePattern
是否为s1, s2
samePattern
,所以它是false
以下是上述算法的简化版本:
static boolean samePatternSimplified(String s1, String s2) {
if (s2.length() == 0) {
return s1.length() == 0;
} else if (s2.charAt(0) == '*') {
return samePatternSimplified(s1, s2.substring(1))
|| (s1.length() != 0 && samePatternSimplified(s1.substring(1), s2));
} else if (s1.length() != 0 && s2.charAt(0) == s1.charAt(0)) {
return samePatternSimplified(s1.substring(1), s2.substring(1));
} else {
return false;
}
}
String.isEmpty()
true
为length()
时才会返回0
。?:
运算符for (String pattern : patterns)
构造