使用递归获取第一个String中第一个出现第二个字符串的索引

时间:2015-04-03 00:03:46

标签: java

public int indexOf(String s1,String s2){
   if(s1.length()<s2.length())
       return -1;
   else if(s1.substring(s1.length()-s2.length()).equals(s2))
       return s1.length()-s2.length();
   else 
       return indexOf(s1.substring(0,s1.length()-1),s2);                  
}    

我写了这个方法来获取第一个字符串中第二个字符串的索引 但它有一个错误,它无法有效地返回第一个出现的第二个字符串,这是因为我使用逻辑从后面找到第二个字符串,我想不出任何其他逻辑。任何建议将不胜感激。

example of a failure case: firstString "BarackObama" second string "a"

4 个答案:

答案 0 :(得分:1)

正如您所说,您正在倒退。相反,你应该继续前进:

public static int indexOf(String s1, String s2){
    if(s1.length()<s2.length()) {
        return -1;
    }
    else if(s1.substring(0, s2.length()).equals(s2)) {
        return 0;
    }
    else {
        int i = indexOf(s1.substring(1, s1.length()), s2);
        if (i == -1) {
            return i;
        } else {
            return 1 + i;
        }
    }
}

示例:

String s1 = "BarackObama";
String s2 = "rac";
indexOf(s1, s2);

它会像这样运行:

indexOf("BarackObama", "rac"):
    "BarackObama".substring(0, 3).equals("rac") -> false
    return 1 + indexOf("BarackObama".substring(1, 11), "rac")

indexOf("arackObama", "rac"):
    "arackObama".substring(0, 3).equals("rac") -> false
    return 1 + indexOf("arackObama".substring(1, 10), "rac")

indexOf("rackObama", "rac"):
    "rackObama".substring(0, 3).equals("rac") -> true
    return 0;

return 0 + 1 + 1 = 2

答案 1 :(得分:0)

我认为你使用subString(int startIndex)的方式,它会从最后给你角色。如果仅将参数传递给subString方法,则它将作为它返回的subString的起始索引。所以万一你的例子,你会得到&#34; a&#34;在&#34; BarackObama&#34;结束时。您可以尝试使用substring(int beginIndex, int endIndex)

答案 2 :(得分:0)

在这里。

private int indexOf(String s1,String s2){
    int index=0;
    if( s1 ==null || s2 ==null){
        return -1;
    }else if(s1.length()<s2.length()){
        return -1;
    }else{
        index=s1.lastIndexOf(s2); 
        s1=s1.substring(0,index);
        if(!s1.contains(s2)){
            return index;
        }else{
            return indexOf(s1,s2);
        }
    }
}

答案 3 :(得分:0)

public int indexOf(String s1, String s2){
    if (s1.length() < s2.length()){
    return -1;
    } else {
        int n = 0;
    int index = findIndex(s1, s2, n);
    return index;
    }
}

private int findIndex(String s1, String s2, int n){
    if (s1.substring(n, (n + s2.length())).equals(s2)){
        return n;
    } else if ((n < s1.length() - s2.length())){
        return findIndex(s1, s2, (n + 1));
    } else{
      return -1;  
    }
}