import
java.io.*;
import
java.util.*;
class
GFG {
static
String getBestString(String S,
List<String> group)
{
boolean
isAnagram =
false
;
String bestString =
null
;
int
minMoves = Integer.MAX_VALUE;
int
[] charCountS = getCharCount(S);
for
(String S1 : group) {
int
[] charCountS1 = getCharCount(S1);
boolean
anagram
= checkIsAnagram(charCountS,
charCountS1);
if
(!anagram)
continue
;
isAnagram =
true
;
int
moves = findMinMoves(S, S1);
if
(moves < minMoves) {
minMoves = moves;
bestString = S1;
}
}
return
(isAnagram) ? bestString :
"-1"
;
}
static
int
findMinMoves(String S, String S1)
{
int
minMoves =
0
;
int
[] fenwickTree =
new
int
[S.length() +
1
];
List<List<Integer> > charPositions
= getPositions(S1);
for
(
int
i = S.length() -
1
; i >=
0
; i--) {
List<Integer> temp
= charPositions.get(
S.charAt(i) -
'a'
);
int
size = temp.size() -
1
;
int
index = temp.remove(size) +
1
;
int
leftShift = get(
fenwickTree, index);
update(fenwickTree, index);
index -= leftShift;
minMoves += Math.abs(i - index +
1
);
}
return
minMoves;
}
static
List<List<Integer> > getPositions(
String S)
{
@SuppressWarnings
(
"unchecked"
)
List<List<Integer> > charPositions
=
new
ArrayList();
for
(
int
i =
0
; i <
26
; i++)
charPositions.add(
new
ArrayList<Integer>());
for
(
int
i =
0
; i < S.length(); i++)
charPositions.get(
S.charAt(i) -
'a'
)
.add(i);
return
charPositions;
}
static
void
update(
int
[] fenwickTree,
int
index)
{
while
(index < fenwickTree.length) {
fenwickTree[index]++;
index += (-index) & index;
}
}
static
int
get(
int
[] fenwickTree,
int
index)
{
int
leftShift =
0
;
leftShift += fenwickTree[index];
while
(index >
0
) {
index -= (-index) & index;
leftShift += fenwickTree[index];
}
return
leftShift;
}
static
int
[] getCharCount(String S)
{
int
[] charCount =
new
int
[
26
];
for
(
int
i =
0
; i < S.length(); i++)
charCount[S.charAt(i) -
'a'
]++;
return
charCount;
}
static
boolean
checkIsAnagram(
int
[] charCountS,
int
[] charCountS1)
{
for
(
int
i =
0
; i <
26
; i++) {
if
(charCountS[i] != charCountS1[i])
return
false
;
}
return
true
;
}
public
static
void
main(String[] args)
{
String S =
"abcdac"
;
String arr[] = {
"cbdaca"
,
"abcacd"
,
"abcdef"
};
String bestString
= getBestString(S, Arrays.asList(arr));
System.out.println(bestString);
}
}
0 comments:
Post a Comment