import
java.util.Arrays;
public
class
Main {
static
final
int
DIGITS =
10
;
static
int
[] priority =
new
int
[DIGITS];
static
class
Compare {
boolean
compare(
char
x,
char
y) {
return
priority[x -
'0'
] < priority[y -
'0'
];
}
}
static
void
nextGreater(
char
[] num,
int
n,
int
[] pre) {
Arrays.fill(priority,
0
);
int
assign =
1
;
for
(
int
i =
0
; i < DIGITS; i++) {
priority[pre[i]] = assign;
assign++;
}
boolean
a = nextPermutation(num, n,
new
Compare());
if
(!a)
prevPermutation(num, n,
new
Compare());
}
static
boolean
nextPermutation(
char
[] a,
int
n, Compare c) {
int
i = n -
2
;
while
(i >=
0
&& c.compare(a[i], a[i +
1
])) {
i--;
}
if
(i <
0
)
return
false
;
int
j = n -
1
;
while
(c.compare(a[i], a[j])) {
j--;
}
swap(a, i, j);
reverse(a, i +
1
, n -
1
);
return
true
;
}
static
void
prevPermutation(
char
[] a,
int
n, Compare c) {
int
i = n -
2
;
while
(i >=
0
&& !c.compare(a[i], a[i +
1
])) {
i--;
}
if
(i <
0
)
return
;
int
j = n -
1
;
while
(!c.compare(a[i], a[j])) {
j--;
}
swap(a, i, j);
reverse(a, i +
1
, n -
1
);
}
static
void
swap(
char
[] a,
int
i,
int
j) {
char
tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
static
void
reverse(
char
[] a,
int
l,
int
r) {
while
(l < r) {
swap(a, l, r);
l++;
r--;
}
}
public
static
void
main(String[] args) {
char
[] num =
"237144"
.toCharArray();
int
n = num.length;
int
[] pre = {
1
,
6
,
7
,
5
,
2
,
9
,
8
,
0
,
4
,
3
};
nextGreater(num, n, pre);
System.out.println(
"Next Greater: "
+
new
String(num));
}
}