【问题标题】:indexOf method using recursion使用递归的 indexOf 方法
【发布时间】:2015-03-27 01:04:34
【问题描述】:

我需要编写一个名为 indexOf 的递归方法,它接受两个字符串作为参数,并返回第一个字符串中第二个字符串第一次出现的起始索引(如果未找到,则返回 -1)。我必须使用递归来解决这个问题。 以下是一些示例结果:

indexOf("Barack Obama", "Bar")  0

indexOf("Barack Obama", "ck")  4

indexOf("Barack Obama", "a")  1

indexOf("Barack Obama", "McCain")  -1

indexOf("Barack Obama", "BAR")  -1

这是我的解决方案,但它给了我 6 的 indexOf("Barack Obama", "McCain") 而不是 -1。

public static int indexOf(String s1, String s2) {
        if(s1.equals(s2))
            return 0;

        else
            return indexOfHelper(s1, s2, 0); 
    }
private static int indexOfHelper(String s1, String s2, int ctr) {
        if(s2.length() > s1.length())
            return -1;

        if(s2.length() == 0 || s1.length() == 0)    //base case
            return ctr;     

        else                    //recursive case
            if(s1.charAt(0) == s2.charAt(0)){       //if there is a matching character
                if(s1.substring(0, s2.length()).equals(s2))
                    return ctr;     //if there is a matching character and the rest of the strings match as well
                else
                    return -1;        //if there is a matching character but the rest of the strings don't match
            }
            else
                return 1 + indexOfHelper(s1.substring(1), s2, ctr);

}

【问题讨论】:

  • 你说“它不起作用”是什么意思?怎么不行?
  • 如果寻找匹配的 starting 索引,为什么代码“1 +”(递归)索引?慢慢地逐步完成程序(使用调试器和/或手动)并验证有关它的值和假设。
  • 例如:indexOf("Barak obama", "ck") 给我答案 5 而不是 4

标签: java


【解决方案1】:

我必须说递归步骤非常棘手。它通过了所有测试用例。我希望以下有所帮助。这里有 Java 和 C++ 代码

JAVA

int indexOf (String s1, String s2) {

    if (s1.length() == 0 && s2.length() == 0) {
        return 0;
    } else if (s1.length() == 0) {
        return -1;
    } else if (s2.length() == 0) {
        return 0;
    } else if (s2.length()>s1.length()) {
        return -1;
    }
    else if (s1.charAt(0)  == s2.charAt(0)) {
        int subIndex = indexOf(s1.substring(1),s2.substring(1));
        return  subIndex == -1 ? -1: subIndex;


    } else {
        int subIndex = indexOf(s1.substring(1),s2);
        return  subIndex == -1 ? -1: subIndex+1;
    }

}

这里是 C++ 代码

int indexOf (string s1, string s2) {

        if (s1 == "" && s2 == "") {
            return 0;
        } else if (s1 == "") {
            return -1;
        } else if (s2=="") {
            return 0;
        } else if (s2.size()>s1.size()) {
            return -1;
        }
        else if (s1 [0] == s2[0]) {
            int subIndex = indexOf(s1.substr(1,s1.length()),s2.substr(1,s2.length()));
            return  subIndex == -1 ? -1: subIndex;


        } else {
            int subIndex = indexOf(s1.substr(1,s1.length()),s2);
            return  subIndex == -1 ? -1: subIndex+1;
        }

    }

【讨论】:

    【解决方案2】:

    这是我的解决方案

    public static void main(String[] args) {
        System.out.println(indexOf("Ninja!", "i"));
        System.out.println(indexOf("ninja2", "ja2"));
        System.out.println(indexOf("ninja2", "hae"));
    }
    
    public static int indexOf(String s, String contains) {
        if (contains.length() > s.length()) {
            return -1;
        }
        return indexOf(s, contains, 0);
    }
    
    private static int indexOf(String s, String contains, int index) {
        if ((s.length() - contains.length()) < index) {
            return -1;
        }
        if (s.substring(index, index + contains.length()).equals(contains)) {
            return index;
        } else {
        return indexOf(s, contains, index + 1);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-13
      • 2016-11-12
      • 2017-07-29
      • 2011-11-03
      • 2016-08-05
      • 2018-07-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多