【问题标题】:Index of first distinct character between two strings using a recursive method使用递归方法的两个字符串之间的第一个不同字符的索引
【发布时间】:2021-06-18 07:44:50
【问题描述】:

我需要使用递归方法找到两个字符串之间第一个不同字符的索引。

具有预期输出的示例:

rFirstDistinctPlace("Little parcels", "Little pretzels") -> 8

rFirstDistinctPlace("金影", "金影") -> 0

rFirstDistinctPlace("gold", "golda") -> 4

rFirstDistinctPlace("gold","gold") -> -1

注意: 我不能使用 .equals() 函数

我正在努力解决的问题是,如果字符串相等,我需要返回 -1,否则它可以正常工作。

这是我的代码:

    public static int rFirstDistinctPlace (String s1, String s2) {  
    if (smallestString(s1,s2).length()==0){
            return 0;
    }
    if(s1.charAt(0)!=s2.charAt(0))
        return rFirstDistinctPlace(s1.substring(0,0),s2.substring(0,0));

    return 1+rFirstDistinctPlace(s1.substring(1),s2.substring(1));

}

这是smallestString的辅助方法:

    public static String smallestString (String s1, String s2){
    if(s1.length()>s2.length()){
        return s2;
    }
    else if (s2.length()>s1.length()){
        return s1;
    }
    else
        return s1;
}

谢谢!

【问题讨论】:

    标签: java string recursion


    【解决方案1】:

    递归解决方案:

    • 如果两个字符串为空,则表示相等,返回-1

    • 如果其中一个为空或第一个字符不匹配,则返回0

    • 否则返回子串,如果结果是-1,则返回,否则返回加上1

    public static void main(String[] args) {
        System.out.println(rFirstDistinctPlace("Little parcels", "Little pretzels")); //8
        System.out.println(rFirstDistinctPlace("Gold shadow", "gold shadow")); //0
        System.out.println(rFirstDistinctPlace("gold", "golda")); //4
        System.out.println(rFirstDistinctPlace("gold","gold")); //-1
    }
    public static int rFirstDistinctPlace (String s1, String s2) {
        if(s1.isEmpty() && s2.isEmpty()) return -1;
        else if (s1.isEmpty() || s2.isEmpty() || s1.charAt(0) != s2.charAt(0)) return 0; 
        int index = rFirstDistinctPlace(s1.substring(1), s2.substring(1));
        return index == -1 ? index : 1 + index;
    }
    

    迭代解决方案:

    • 使用for-loop 遍历两个字符串,直到到达其中一个字符串的末尾
      • 如果当前index处的两个字符串的字符不同,则返回i
    • 最后,如果两个字符串有不同的lengths,则返回i,否则返回-1
    public static int rFirstDistinctPlace (String s1, String s2) {
        int i = 0;
        for(i = 0; i < s1.length() && i < s2.length(); i++) {
            if(s1.charAt(i) != s2.charAt(i)) {
                return i;
            }
        }
        return s1.length() != s2.length() ? i : -1;
    }
    

    【讨论】:

    • 迭代编写此函数的最佳方法是什么?
    • @itailitai 我为答案添加了一个可能的迭代解决方案
    • 太棒了。感谢您的帮助!
    【解决方案2】:

    没那么复杂。

    1. 如果字符串相等,则返回 -1
    2. 如果其中一个字符串的长度是 0 或者如果它们的第一个字符不匹配,则返回 0
    3. 否则,返回1 + rFirstDistinctPlace(s1.substring(1), s2.substring(1))

    演示:

    class Main {
        public static void main(String[] args) {
            System.out.println(rFirstDistinctPlace("Little parcels", "Little pretzels")); // 8
            System.out.println(rFirstDistinctPlace("Gold shadow", "gold shadow"));// 0
            System.out.println(rFirstDistinctPlace("gold", "golda"));// 4
            System.out.println(rFirstDistinctPlace("gold", "gold"));// -1
        }
    
        public static int rFirstDistinctPlace(String s1, String s2) {
            if (Objects.equals(s1, s2))
                return -1;
    
            if (s1.length() == 0 || s2.length() == 0 || s1.charAt(0) != s2.charAt(0))
                return 0;
    
            return 1 + rFirstDistinctPlace(s1.substring(1), s2.substring(1));
        }
    }
    

    输出:

    8
    0
    4
    -1
    

    【讨论】:

    • 谢谢,但我不能使用 .equals()
    猜你喜欢
    • 2011-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    • 1970-01-01
    • 2022-01-11
    • 2012-01-12
    相关资源
    最近更新 更多