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:我想是吧。。。真是可怕。