Java ISUBSTRING递归方法
下面是调用递归方法的代码:Java ISUBSTRING递归方法,java,methods,recursion,substring,Java,Methods,Recursion,Substring,下面是调用递归方法的代码: if (isSubstring(str1, str2)) System.out.println ("\"" + str1 + "\" is a substring of " + "\"" + str2 + "\""); else System.out.println ("\"" + str1 + "\" is not a substring of " + "
if (isSubstring(str1, str2))
System.out.println ("\"" + str1 + "\" is a substring of " +
"\"" + str2 + "\"");
else
System.out.println ("\"" + str1 + "\" is not a substring of " +
"\"" + str2 + "\"");
这是我迄今为止完成的方法,它几乎可以工作:
if (isSubstring(str1, str2))
System.out.println ("\"" + str1 + "\" is a substring of " +
"\"" + str2 + "\"");
else
System.out.println ("\"" + str1 + "\" is not a substring of " +
"\"" + str2 + "\"");
public static boolean isSubstring(String str, String target)
{
if (target.length() == 0)
return false;
if (str.equals(target))
return true;
else
return (isSubstring(str, target.substring(0,target.length()-1)));
}
因此,如果str1作为“zzz”传递,而str2作为“zzzabcdef”传递,那么它将返回true。但是,如果str2是“abczzxx”或“abczzz”,则不会返回true。有人有什么建议或想法吗?有-基本上,递归方法总是去掉最后一个字符,然后递归,直到得到一个空字符串或值等于第一个字符串
if (isSubstring(str1, str2))
System.out.println ("\"" + str1 + "\" is a substring of " +
"\"" + str2 + "\"");
else
System.out.println ("\"" + str1 + "\" is not a substring of " +
"\"" + str2 + "\"");
这意味着它只能在目标字符串的开头找到第一个字符串,这意味着它实际上是一个startsWith
方法
if (isSubstring(str1, str2))
System.out.println ("\"" + str1 + "\" is a substring of " +
"\"" + str2 + "\"");
else
System.out.println ("\"" + str1 + "\" is not a substring of " +
"\"" + str2 + "\"");
有一种方法效率极低,但我认为可行,那就是试着从前面去掉一个角色,然后(独立地)从后面去掉一个角色:
if (isSubstring(str1, str2))
System.out.println ("\"" + str1 + "\" is a substring of " +
"\"" + str2 + "\"");
else
System.out.println ("\"" + str1 + "\" is not a substring of " +
"\"" + str2 + "\"");
是-基本上,递归方法总是先去掉最后一个字符,然后递归,直到得到一个空字符串或值等于第一个字符串
if (isSubstring(str1, str2))
System.out.println ("\"" + str1 + "\" is a substring of " +
"\"" + str2 + "\"");
else
System.out.println ("\"" + str1 + "\" is not a substring of " +
"\"" + str2 + "\"");
这意味着它只能在目标字符串的开头找到第一个字符串,这意味着它实际上是一个startsWith
方法
if (isSubstring(str1, str2))
System.out.println ("\"" + str1 + "\" is a substring of " +
"\"" + str2 + "\"");
else
System.out.println ("\"" + str1 + "\" is not a substring of " +
"\"" + str2 + "\"");
有一种方法效率极低,但我认为可行,那就是试着从前面去掉一个角色,然后(独立地)从后面去掉一个角色:
if (isSubstring(str1, str2))
System.out.println ("\"" + str1 + "\" is a substring of " +
"\"" + str2 + "\"");
else
System.out.println ("\"" + str1 + "\" is not a substring of " +
"\"" + str2 + "\"");
试一试
if (isSubstring(str1, str2))
System.out.println ("\"" + str1 + "\" is a substring of " +
"\"" + str2 + "\"");
else
System.out.println ("\"" + str1 + "\" is not a substring of " +
"\"" + str2 + "\"");
这应该递归地尝试目标中的所有子字符串。尝试
if (isSubstring(str1, str2))
System.out.println ("\"" + str1 + "\" is a substring of " +
"\"" + str2 + "\"");
else
System.out.println ("\"" + str1 + "\" is not a substring of " +
"\"" + str2 + "\"");
这将递归地尝试目标中的所有子字符串。目前,您只删除字符串末尾的字符。您的函数可以通过(…)正确调用
startsWith
if (isSubstring(str1, str2))
System.out.println ("\"" + str1 + "\" is a substring of " +
"\"" + str2 + "\"");
else
System.out.println ("\"" + str1 + "\" is not a substring of " +
"\"" + str2 + "\"");
对于子字符串匹配,我将尝试以下算法:
if (isSubstring(str1, str2))
System.out.println ("\"" + str1 + "\" is a substring of " +
"\"" + str2 + "\"");
else
System.out.println ("\"" + str1 + "\" is not a substring of " +
"\"" + str2 + "\"");
在没有匹配项时从主字符串中删除字符。
当两个字符串匹配时开始使用它们,直到您匹配子字符串的所有连续字符,或者直到您找到一个不匹配的字符,这将允许您提前停止
if (isSubstring(str1, str2))
System.out.println ("\"" + str1 + "\" is a substring of " +
"\"" + str2 + "\"");
else
System.out.println ("\"" + str1 + "\" is not a substring of " +
"\"" + str2 + "\"");
大概是这样的:
if (isSubstring(str1, str2))
System.out.println ("\"" + str1 + "\" is a substring of " +
"\"" + str2 + "\"");
else
System.out.println ("\"" + str1 + "\" is not a substring of " +
"\"" + str2 + "\"");
boolean isSubString(String s1, String s, boolean match) {
if (s1 == "") return true;
if (s == "") return false;
if ((s1.charAt(0) != s.charAt(0)) && match) return false; //failfast
if (s1.charAt(0) == s.charAt(0)) return isSubString(s1.substring(1), s.substring(1), true);
return isSubString(s1.substring(1), s.substring(1), match);
}
boolean isSubString(String s1, String s) {
return isSubString(s1, s,false);
}
当前,只能从字符串末尾删除字符。您的函数可以通过(…)正确调用
startsWith
if (isSubstring(str1, str2))
System.out.println ("\"" + str1 + "\" is a substring of " +
"\"" + str2 + "\"");
else
System.out.println ("\"" + str1 + "\" is not a substring of " +
"\"" + str2 + "\"");
对于子字符串匹配,我将尝试以下算法:
if (isSubstring(str1, str2))
System.out.println ("\"" + str1 + "\" is a substring of " +
"\"" + str2 + "\"");
else
System.out.println ("\"" + str1 + "\" is not a substring of " +
"\"" + str2 + "\"");
在没有匹配项时从主字符串中删除字符。
当两个字符串匹配时开始使用它们,直到您匹配子字符串的所有连续字符,或者直到您找到一个不匹配的字符,这将允许您提前停止
if (isSubstring(str1, str2))
System.out.println ("\"" + str1 + "\" is a substring of " +
"\"" + str2 + "\"");
else
System.out.println ("\"" + str1 + "\" is not a substring of " +
"\"" + str2 + "\"");
大概是这样的:
if (isSubstring(str1, str2))
System.out.println ("\"" + str1 + "\" is a substring of " +
"\"" + str2 + "\"");
else
System.out.println ("\"" + str1 + "\" is not a substring of " +
"\"" + str2 + "\"");
boolean isSubString(String s1, String s, boolean match) {
if (s1 == "") return true;
if (s == "") return false;
if ((s1.charAt(0) != s.charAt(0)) && match) return false; //failfast
if (s1.charAt(0) == s.charAt(0)) return isSubString(s1.substring(1), s.substring(1), true);
return isSubString(s1.substring(1), s.substring(1), match);
}
boolean isSubString(String s1, String s) {
return isSubString(s1, s,false);
}
我遇到了一个挑战,就是只使用charAt()、length()和substring()编写这种函数,下面是我编写的,我认为它工作得很好
if (isSubstring(str1, str2))
System.out.println ("\"" + str1 + "\" is a substring of " +
"\"" + str2 + "\"");
else
System.out.println ("\"" + str1 + "\" is not a substring of " +
"\"" + str2 + "\"");
public static void main(String[] args)
{
System.out.println(isSubstring("pgram", "program")); // Expected: false
System.out.println(isSubstring("string", "substring")); // Expected: true
System.out.println(isSubstring("zzz", "zzzabcdef")); // Expected: true
System.out.println(isSubstring("zzz", "abczzzxx")); // Expected: true
System.out.println(isSubstring("zzz", "abczzz")); // Expected: true
System.out.println(isSubstring("hell", "hello")); // Expected: true
System.out.println(isSubstring("ada", "Madam")); // Expected: true
}
public static boolean isSubstring(String str, String target)
{
if (str.length() == 0)
return true;
if (target.length() == 0)
return false;
if (str.charAt(0) == target.charAt(0)) // "zzz", "zzzabcdef"
{
if (str.length() == target.length()) // "zzz", "zzz"
return isSubstring(str.substring(1), target.substring(1));
else if (target.length() > str.length()) // "zzz", "zzzabcdef"
{
boolean r1 = isSubstring(str, target.substring(0, str.length())); // "zzz", "zzzabcdef"
boolean r2 = isSubstring(str, target.substring(1)); // Or maybe "string", "substring"
return r1 || r2;
}
}
return isSubstring(str, target.substring(1));
}
我遇到了一个挑战,就是只使用charAt()、length()和substring()编写这种函数,下面是我编写的,我认为它工作得很好
if (isSubstring(str1, str2))
System.out.println ("\"" + str1 + "\" is a substring of " +
"\"" + str2 + "\"");
else
System.out.println ("\"" + str1 + "\" is not a substring of " +
"\"" + str2 + "\"");
public static void main(String[] args)
{
System.out.println(isSubstring("pgram", "program")); // Expected: false
System.out.println(isSubstring("string", "substring")); // Expected: true
System.out.println(isSubstring("zzz", "zzzabcdef")); // Expected: true
System.out.println(isSubstring("zzz", "abczzzxx")); // Expected: true
System.out.println(isSubstring("zzz", "abczzz")); // Expected: true
System.out.println(isSubstring("hell", "hello")); // Expected: true
System.out.println(isSubstring("ada", "Madam")); // Expected: true
}
public static boolean isSubstring(String str, String target)
{
if (str.length() == 0)
return true;
if (target.length() == 0)
return false;
if (str.charAt(0) == target.charAt(0)) // "zzz", "zzzabcdef"
{
if (str.length() == target.length()) // "zzz", "zzz"
return isSubstring(str.substring(1), target.substring(1));
else if (target.length() > str.length()) // "zzz", "zzzabcdef"
{
boolean r1 = isSubstring(str, target.substring(0, str.length())); // "zzz", "zzzabcdef"
boolean r2 = isSubstring(str, target.substring(1)); // Or maybe "string", "substring"
return r1 || r2;
}
}
return isSubstring(str, target.substring(1));
}
您的方法可以是一行内容:
returnstr.contains(target)代码>我注意到您的if(target.length()==0)
语句。您可能还需要对str和target进行一些空检查。我喜欢使用StringUtils.isBlank()
方法;请看@assylias,我想重点是将递归作为exercise@maasg可能-OP应该说清楚。如果目标仅仅是重新实现contains,那么查看源代码也会很有帮助代码>我注意到您的if(target.length()==0)
语句。您可能还需要对str和target进行一些空检查。我喜欢使用StringUtils.isBlank()
方法;请看@assylias,我想重点是将递归作为exercise@maasg可能-OP应该说清楚。如果目标仅仅是重新实现contains,那么查看源代码也会很有启发性。@maasg:我想是这样的。。。“这真是太可怕了。”@maasg:我想是吧。。。真是可怕。