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
}
}

