Lexicographically greater string
For given words let’s try to create first lexicographically greater string than given. Try to change only order of letters. Length of string is the same.
import java.util.Arrays; public class Lexi { private static String sortAlfabetically(String base) { char[] chars = base.toCharArray(); Arrays.sort(chars); return String.valueOf(chars); } public String greaterThanBase(String base) { for (int iter_movingChar = base.length() - 1; iter_movingChar >= 0; iter_movingChar--) { char movingChar = base.charAt(iter_movingChar); for (int iter_charToReplacement = iter_movingChar - 1; iter_charToReplacement >= 0; iter_charToReplacement--) { char replacementLowerChar = base.charAt(iter_charToReplacement); if ((int) movingChar > (int) replacementLowerChar) { String result = ""; //return head result += base.substring(0, iter_charToReplacement); //return moved char result += movingChar; //clear tail from moved char String tail = base.substring(iter_charToReplacement); tail = tail.replaceFirst("" + movingChar, ""); //add sorted alfabetically tail result += sortAlfabetically(tail); System.out.println(base + "->" + result); return result; } } } System.out.println(base + "->" + base + " (Same string)"); return base; } public static void main(String[] args) { Lexi lexi = new Lexi(); lexi.greaterThanBase("ab");//ba lexi.greaterThanBase("abcd");//acbd lexi.greaterThanBase("dkhc");//hcdk lexi.greaterThanBase("hefg");//hegf lexi.greaterThanBase("aaa");//aaa lexi.greaterThanBase("dcba");//dcba } }