【发布时间】:2011-02-28 11:25:55
【问题描述】:
所以我一整天都在尝试解决这个任务,就是无法完成。
以下函数接受 2 个字符串,第二个(不是第一个)可能包含 *(星号)。* 是一个字符串(空,1 个字符或更多)的替换,它可以出现(仅在 s2 中)一次、两次、更多或根本不出现,它不能与另一个 * 相邻(@987654324 @),不需要检查。
public static boolean samePattern(String s1, String s2)
如果字符串的模式相同,则返回 true。
它必须是递归的,不能使用任何循环、静态和全局变量。
可以使用局部变量和方法重载。
只能使用这些方法:charAt(i)、substring(i)、substring(i, j)、length()。
示例:
1:TheExamIsEasy; 2:The*xamIs*y → 真
1:TheExamIsEasy; 2:Th*mIsEasy* → 真
1:TheExamIsEasy; 2:* → 真
1:TheExamIsEasy; 2:TheExamIsEasy → 真
1:TheExamIsEasy; 2:The*IsHard → 错误
我尝试使用 charAt 逐个比较字符,直到遇到星号,然后通过比较连续字符 (i+1) 与位置处的 s1 的字符来检查星号是否为空i,如果为真 -- 继续递归,使用 i+1 作为 s2 的计数器和 i 作为 s1 的计数器;
如果为 false -- 继续使用 i+1 作为两者的计数器进行递归。
继续此操作,直到找到另一个星号或字符串结尾。
我不知道,我的大脑失去了对事物的追踪,无法集中注意力,有任何指针/提示吗?我的方向正确吗?
另外,有人告诉我们要使用回溯技术来解决这个问题。
到目前为止我的代码(即使在理论上也不能完成这项工作):
public static boolean samePattern(String s1, String s2) {
if (s1.equals(s2) || s2 == "*") {
return true;
}
return samePattern(s1, s2, 1);
}
public static boolean samePattern(String s1, String s2, int i)
{
if (s1.equals(s2))
return true;
if (i == s2.length() - 1) // No *'s found -- not same pattern.
return false;
if (s1.substring(0, i).equals(s2.substring(0, i)))
samePattern(s1, s2, i+1);
else if (s2.charAt(i-1) == '*')
samePattern(s1.substring(0, i-1), s2.substring(0, i), 1); // new smaller strings.
else
samePattern(s1.substring(1), s2, i);
}
【问题讨论】:
-
感谢您提出建议,而不是整个解决方案。
标签: java string recursion wildcard backtracking