isSubstring递归方法

时间:2012-11-08 15:57:44

标签: 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 " + 
                       "\"" + 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为“abczzzxx”或“abczzz”,则不会返回true。有没有人有任何建议或想法?

4 个答案:

答案 0 :(得分:7)

是的 - 基本上你的递归方法总是只取下最后一个字符,然后递归,直到它有一个空字符串或者值等于到第一个字符串。

这意味着唯一的可能的位置,它可以找到第一个字符串位于目标字符串的开头,这意味着它实际上是startsWith方法。

一种可怕的低效率选项,但我认为应该可行的选择是尝试从前面的角色中取出一个角色尝试将一个角色放在最后(独立):

return isSubstring(str, target.substring(0, target.length() - 1))
    || isSubstring(str, target.substring(1));

答案 1 :(得分:0)

尝试

public static boolean isSubstring(String str, String target) {
            System.out.println("target :" + target);
            if (str.equals(target))
                return true;
            else if (str.length() > target.length())
                return false;
            else
                return (isSubstring(str, target.substring(1, target.length())))
                        || (isSubstring(str,
                                target.substring(0, target.length() - 1)));
        }

这应该递归地尝试目标的所有子字符串。

答案 2 :(得分:0)

目前,您只会从字符串末尾删除字符。您的功能可以正确调用startsWith(...)

对于子串匹配,我会尝试以下算法:

在没有匹配的情况下从主字符串中删除字符。 在匹配时匹配字符串的所有连续字符,或者直到找到不匹配的字符串,开始使用两个字符串,这将允许您提前停止。

这样的事情:

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);
}

答案 3 :(得分:0)

我只用 charAt()、length() 和 substring() 编写这种函数时遇到了挑战,这是我写的,我认为它工作正常......

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));
}