如何在java中使用递归查找公共后缀

如何在java中使用递归查找公共后缀,java,recursion,Java,Recursion,所以我在堆栈溢出上看到,公共后缀可以使用不使用递归的方法派生。我很好奇是否可以用递归实现同样的效果。尝试使用以下代码,但得到java.lang.StackOverflower错误。有人能帮忙吗 public static String commonSuffixWithRecursion(String s1, String s2) { if(s1.length()==0 || s2.length()==0) { return "Strings are empty";

所以我在堆栈溢出上看到,公共后缀可以使用不使用递归的方法派生。我很好奇是否可以用递归实现同样的效果。尝试使用以下代码,但得到java.lang.StackOverflower错误。有人能帮忙吗

public static String commonSuffixWithRecursion(String s1, String s2) {
    if(s1.length()==0 || s2.length()==0) {
        return "Strings are empty";
    }
    if(s1.charAt(s1.length()-1)==s2.charAt(s2.length()-1)) {
        return s1.length()-1 + commonSuffixWithRecursion(s1,s2);
    }
    return "No common Suffix";
}
  • 当没有公共后缀时,它应该返回空字符串

  • 您可以使用
    子字符串
    获取下一轮的输入

  • 当前字符应附加在下一轮的结果之后

示例代码:

public static String commonSuffixWithRecursion(String s1, String s2) {
    if (s1.length() == 0 || s2.length() == 0) {
        return "";
    }
    if (s1.charAt(s1.length() - 1) == s2.charAt(s2.length() - 1)) {
        String nextS1 = s1.substring(0, s1.length() - 1);
        String nextS2 = s2.substring(0, s2.length() - 1);
        return commonSuffixWithRecursion(nextS1, nextS2 ) + s1.charAt(s1.length() - 1);
    }
    return "";
}
测试用例:

public static void main(String[] args) {
    System.out.println(commonSuffixWithRecursion("dbc", "abc"));    // bc
    System.out.println(commonSuffixWithRecursion("a", "a"));    // a
    System.out.println(commonSuffixWithRecursion("ab", "b"));   // b
    System.out.println(commonSuffixWithRecursion("a", "b"));    // empty
}

一种简单的递归方法是

public static String commonSuffixWithRecursion(String x, String y, int m, int n) {
        if(m <= 0 || n <= 0)
            return "";
        if (x.charAt(m-1) == y.charAt(n-1)) 
            return commonSuffixWithRecursion(x, y, m-1, n-1) + x.charAt(m-1);
        else 
         return "";
    }
公共静态字符串commonSuffixWithRecursion(字符串x、字符串y、int m、int n){

如果(m这里有另一个使用递增后缀大小的选项:

public static String commonSuffixWithRecursion(String s1, String s2, int suffixSize) {
    int i1 = s1.length() - suffixSize;
    int i2 = s2.length() - suffixSize;
    if (i1 > -1 && i2 > -1 && s1.charAt(i1) == s2.charAt(i2)) {
        return commonSuffixWithRecursion(s1, s2, suffixSize + 1);
    }
    return s1.substring(i1 + 1);
}
以下是一些测试用例:

public static void main(String[] args) {
    System.out.println(commonSuffixWithRecursion("dbc", "abc", 1));    // bc
    System.out.println(commonSuffixWithRecursion("a", "a", 1));    // a
    System.out.println(commonSuffixWithRecursion("ab", "b", 1));   // b
    System.out.println(commonSuffixWithRecursion("a", "b", 1));    // empty
    System.out.println(commonSuffixWithRecursion("a", "bc", 1));    // empty
    System.out.println(commonSuffixWithRecursion("ac", "bc", 1));    // c
    System.out.println(commonSuffixWithRecursion("ac", "bcd", 1));    // empty
    System.out.println(commonSuffixWithRecursion("", "bcd", 1));    // empty
    System.out.println(commonSuffixWithRecursion("bcd", "bcd", 1));    // bcd
}

你没有减少调用之间字符串的大小。我非常反对使用循环,因为它稀释了递归调用的目的。因此没有使用循环来减少字符串的大小。可以使用递归,但我对递归调用有点陌生。@ShaikhSakib我不喜欢开车,因为它稀释了走路的目的。事实并非如此尝试步行500英里是个好主意(除非你有很长的时间这么做)。我的意思是:递归并不总是最合适的解决方案,如果在适当的情况下使用,循环可能会更有效。是的,这是我想要的使用递归的正确方法。谢谢。接受并向上投票!!你可以只向后移动一个常用索引,直到有匹配项,这基本上就是
循环
解决方案。您需要
,并且可以通过不在每次递归调用中添加最后一个字符,而是在找到不匹配的字符时返回子字符串来提高效率。