如何递归字符串末尾的最小ASCII值的char?

时间:2018-05-29 14:51:56

标签: java string recursion

鉴于方法:

public String moveSmallest(String s) {}

如何找到具有最小ASCII值的char,将其放在String的末尾,并返回该String,递归

阅读Find a char..Move the char..Move to end..没有真正回答:我需要的算法是什么,以及如何实现它。

不能使用全局变量,累加器,辅助方法或任何其他结构。

这个问题(在本质上)与How to pass a partial solution to the next recursive call密切相关。

尝试找到min char:

    if (s.length() == 0) {
        return s;
    } else if (s.length() > 1) {
        char c = s.charAt(0) > moveSmallest(s.substring(1)).charAt(s.length()-1) ? s.charAt(0) : moveSmallest(s.substring(1)).charAt(s.length()-1);    
    }

1 个答案:

答案 0 :(得分:1)

好吧,如果你真的想使用递归,那么它就是。

将最小的字母移到最后:

public static String moveSmallestToTheEnd(String s) {
    if (s.length() <= 1)
        return s;
    if (s.length() == 2)
        return s.charAt(0) < s.charAt(1) ? String.valueOf(s.charAt(1)) + s.charAt(0) : s;

    String suffix = s.substring(1);
    String res = moveSmallestToTheEnd(suffix);
    return s.charAt(0) < res.charAt(res.length() - 1) ? suffix + s.charAt(0) : s.charAt(0) + res;
}

输出:

a -> a
ab -> ba
ba -> ba
abc -> bca
bac -> bca
bca -> bca
bcdae -> bcdea
bcae -> bcea

将最高的字母移到开头:

public static String moveHighestToTheBeginning(String s) {
    if (s.length() <= 1)
        return s;
    if (s.length() == 2)
        return s.charAt(0) < s.charAt(1) ? String.valueOf(s.charAt(1)) + s.charAt(0) : s;

    String prefix = s.substring(0, s.length() - 1);
    String res = moveHighestToTheBeginning(prefix);
    return s.charAt(s.length() - 1) > res.charAt(0) ? s.charAt(s.length() - 1) + prefix : res + s.charAt(s.length() - 1);
}

输出:

a -> a
ab -> ba
ba -> ba
abc -> cab
bac -> cba
bca -> cba
bcdae -> ebcda
bcae -> ebca