【发布时间】:2017-01-11 08:58:10
【问题描述】:
我遇到了一些练习题,其中之一是取两个字符串并确定一个是否是另一个的子字符串。我写了我的第一个解决方案:
public static boolean isSubstring(String s1, String s2){
String longer = s1.length() > s2.length() ? s1 : s2;
String shorter = s1.length() < s2.length() ? s1 : s2;
String substring;
for(int i = 0; i < longer.length() && i + shorter.length() <= longer.length(); i++){
substring = longer.substring(i, i + shorter.length());
if(substring.equals(shorter))
return true;
}
return false;
}
然后我记得 Java 有一个用于 String 类的 contains 方法,当时解决方案很简单。 :
public static boolean isSubstringUsingContains(String s1, String s2){
String longer = s1.length() > s2.length() ? s1 : s2;
String shorter = s1.length() < s2.length() ? s1 : s2;
return longer.contains(shorter);
}
由于我正在练习并且我不太擅长递归,所以我认为我应该尝试递归解决这个问题,但我无法正确解决。我如何用递归解决这个问题,与上述解决方案相比,这里使用递归是否有任何优点/缺点。这是我尝试递归解决此问题的失败尝试:
public static boolean isSubstringRecursive(String s1, String s2,int i){
if(s1.length() == 0 || s2.length() == 0)
return false;
String longer = s1.length() > s2.length() ? s1 : s2;
String shorter = s1.length() < s2.length() ? s1 : s2;
if(longer.equals(shorter))
return true;
return isSubstringRecursive(longer.substring(i,i + shorter.length()),shorter,i + 1);
}
编辑
测试用例: 字符串 A = "蝙蝠侠" 字符串 B = "atm" 结果:真
字符串 A = "倒立" 字符串 B = "站立" 结果:真
字符串 A = "Hotsauce" 字符串 B = "ecu" 结果:错误
【问题讨论】:
-
你有测试用例吗?
-
递归是伪装的循环 - 您的工作代码中没有循环:为什么您认为需要递归?
-
我建议您将
startsWith用于您的基本情况,将substring(1)用于您的递归情况。如果较长的字符串以较短的字符串开头,那么您就完成了。否则,删除第一个字符并递归。 -
@assylias 我的第一个解决方案中有一个循环;并且递归不是我需要的东西,而是我需要学习如何正确做的东西。
-
@ElroyJetson Here's 一个很好的递归页面。它是递归应该做的核心:处理大问题(例如树),并将其分解为较小的问题(例如节点)