import
java.util.*;
class
GFG {
static
int
minOperations(String s, String f)
{
if
(s.equals(f))
return
0
;
Map<String, Integer> vis =
new
HashMap<>();
int
n;
n = s.length();
int
pos =
0
;
for
(
int
i =
0
; i < s.length(); i++) {
if
(s.charAt(i) ==
'_'
) {
pos = i;
break
;
}
}
Queue<Map.Entry<String, Integer>> q
=
new
LinkedList<Map.Entry<String, Integer>>();
q.add(
new
AbstractMap.SimpleEntry<String, Integer>(s, pos));
vis.put(s,
0
);
while
(!q.isEmpty()) {
String ss = q.peek().getKey();
int
pp = q.peek().getValue();
int
dist = vis.get(ss);
q.remove();
if
(pp >
0
) {
char
[] ch = ss.toCharArray();
char
temp = ch[pp];
ch[pp] = ch[pp -
1
];
ch[pp -
1
] = temp;
ss = String.valueOf(ch);
if
(!vis.containsKey(ss)) {
if
(ss.equals(f)) {
return
dist +
1
;
}
vis.put(ss, dist +
1
);
q.add(
new
AbstractMap.SimpleEntry<String, Integer>(ss, pp -
1
));
}
ch = ss.toCharArray();
temp = ch[pp];
ch[pp] = ch[pp -
1
];
ch[pp -
1
] = temp;
ss = String.valueOf(ch);
}
if
(pp < n -
1
) {
char
[] ch = ss.toCharArray();
char
temp = ch[pp];
ch[pp] = ch[pp +
1
];
ch[pp +
1
] = temp;
ss = String.valueOf(ch);
if
(!vis.containsKey(ss)) {
if
(ss.equals(f)) {
return
dist +
1
;
}
vis.put(ss, dist +
1
);
q.add(
new
AbstractMap.SimpleEntry<String, Integer>(ss, pp +
1
));
}
ch = ss.toCharArray();
temp = ch[pp];
ch[pp] = ch[pp +
1
];
ch[pp +
1
] = temp;
ss = String.valueOf(ch);
}
if
(pp >
1
&& ss.charAt(pp -
1
) != ss.charAt(pp -
2
)) {
char
[] ch = ss.toCharArray();
char
temp = ch[pp];
ch[pp] = ch[pp -
2
];
ch[pp -
2
] = temp;
ss = String.valueOf(ch);
if
(!vis.containsKey(ss)) {
if
(ss.equals(f)) {
return
dist +
1
;
}
vis.put(ss, dist +
1
);
q.add(
new
AbstractMap.SimpleEntry<String, Integer>(ss, pp -
2
));
}
ch = ss.toCharArray();
temp = ch[pp];
ch[pp] = ch[pp -
2
];
ch[pp -
2
] = temp;
ss = String.valueOf(ch);
}
if
(pp < n -
2
&& ss.charAt(pp +
1
) != ss.charAt(pp +
2
)) {
char
[] ch = ss.toCharArray();
char
temp = ch[pp];
ch[pp] = ch[pp +
2
];
ch[pp +
2
] = temp;
ss = String.valueOf(ch);
if
(!vis.containsKey(ss)) {
if
(ss.equals(f)) {
return
dist +
1
;
}
vis.put(ss, dist +
1
);
q.add(
new
AbstractMap.SimpleEntry<String, Integer>(ss, pp +
2
));
}
ch = ss.toCharArray();
temp = ch[pp];
ch[pp] = ch[pp +
2
];
ch[pp +
2
] = temp;
ss = String.valueOf(ch);
}
}
return
-
1
;
}
public
static
void
main(String[] args)
{
String A =
"aba_a"
;
String B =
"_baaa"
;
System.out.println(minOperations(A, B));
}
}