【问题标题】:Substring between 2 indexes using recursion使用递归的 2 个索引之间的子字符串
【发布时间】:2017-03-30 17:33:34
【问题描述】:

我开始学习 Java,目前我正在玩递归。

我想尝试创建一个 substring 方法,该方法将从两侧以 1 个字符作为子字符串,直到我们得到所需的字符串。

我设法完成了第一部分,但在弄清楚如何从后面插入子字符串时遇到问题。

nm 应该是我们想要在其间进行子串(包括)的索引。

在这个例子中方法的结果应该是“bstri”

这是我的代码:

public static void main(String[] args) {
    String s = "substringme";

    System.out.println(rec(s,2,6));
}

public static String rec(String s, int n, int m) {
    if(n == 0 /* && missing 2nd part of condition */){
        return s;
    } else {
        if(n>0){
            s = s.substring(1);
            n--;  
        }
        if(/* missing condition */){
            s= s.substring(0, s.length()-1);
        }
        return rec(s,n,m);
    }
}

如果能得到任何帮助,我将不胜感激。

【问题讨论】:

    标签: java recursion


    【解决方案1】:

    因此,修复递归方法相当容易。我们所做的与您为 n 所做的完全相同:

    public static String rec(String s, int n, int m) {        
        if (n == 0 && m == 0) { 
            return s;
        }
        else {
            if(n > 0) {
                s = s.substring(1);
                n--;
            }
            if(m > 0) {
                s = s.substring(0, s.length()-1);
                m--;
            }
            return rec(s,n,m);
        }
    }
    

    现在的问题是作为输入给出的m 的值是从字符串的开头测量的,如果它是从字符串的结尾测量的,对我们来说会更方便。

    我们可以引入一个新方法来为我们做这件事,它作为我们递归方法的入口点:

    public static String substr(String s, int n, int m) {
        final int newM = s.length() - m - 1; //-1 to be inclusive of the char
        return rec(s, n, newM);
    }
    

    然后,您可以将 main 方法更改为调用 substr()

    public static void main(String[] args) {
        String s = "substringme";
    
        System.out.println(substr(s,2,6));
    }
    

    当我使用递归方法时,我经常发现自己在编写这类“入口点”方法。如果您正确执行此操作,substr 将是您面向公众的方法,rec 将是私有方法。

    【讨论】:

    • 非常感谢,这帮助很大,我意识到我需要添加方法,但不知道如何实现它。
    【解决方案2】:

    我建议您在第一个循环中执行 m--,因为当您从前面缩短 s 时,作为索引的 m 的定义会发生变化。

     public static String rec(String s, int n, int m) {
             if(n == 0 && m == s.length() - 1){
                 return s;
             } else {
                 if (n > 0) {
                     s = s.substring(1);
                     n--;
                     m--;
                 }
                 if (m < s.length() - 1) {
                     s = s.substring(0, s.length() - 1);
                 }
                 return rec(s, n, m);
             }
         }
    

    【讨论】:

    • 这很聪明,但我觉得可能不如我建议的那样惯用。
    • 总而言之,实际上我看到了你的解决方案,并认为这是一种更清洁的方法。
    • 也感谢这项工作,所以你也得到了支持和回答,我使用了 Michael 的回答,因为我更喜欢这种单独的方法方法(将来想将它用于某些方法),但在使代码更清晰方面做得很好.
    【解决方案3】:

    你可以做的是寻找m和字符串长度之间的差异,并从字符串末尾截掉字符,直到它是正确的长度。

    import java.util.*;
    public class Test {
        public static void main(String[] args) {
            String s = "substringme";
            System.out.println(rec(s,2,6));
        }
    
        public static String rec(String s, int n, int m) {
            if(n == 0 && s.length()-m < 1){
                return s;
            } else {
    
                if(s.length()-m > 1){
                    s= s.substring(0, s.length()-1);
                }
                else if(n>0){
                    s = s.substring(1);
                    n--;  
                }
                return rec(s,n,m);
            }
        }
    }
    

    从 2 到 6 的子字符串也不应该是“bstr”,而不是“bstri”?

    System.out.println(s.substring(2, 6)); //equals bstr
    

    【讨论】:

    • 我相信传统的substr 包含第一个索引,不包含第二个索引。他想要一个包含两个索引的substr
    • 它应该是 bstri 因为字符串的索引 2 是 'b',索引 6 是 'i' 我不想要子字符串的副本,但希望它能够包含第一个和最后一个索引 谢谢无论如何都要帮助我。
    猜你喜欢
    • 2021-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-31
    • 2015-09-28
    • 2015-05-13
    • 2016-05-20
    • 2023-03-06
    相关资源
    最近更新 更多