1
+ package leetcode ;
2
+
3
+ import java .util .HashMap ;
4
+
5
+ class LC_854 {
6
+ public int kSimilarity (String s1 , String s2 ) {
7
+ HashMap <String ,Integer > dp = new HashMap <>();
8
+ StringBuilder sb1 = new StringBuilder (s1 );
9
+ return solve (0 ,sb1 , s2 , dp );
10
+ }
11
+
12
+ public int solve (int idx , StringBuilder s1 , String s2 , HashMap <String ,Integer > dp ) {
13
+ if (idx >= s1 .length ()) return 0 ;
14
+ if (dp .containsKey (s1 .toString ())) return dp .get (s1 .toString ());
15
+ int ret = Integer .MAX_VALUE ;
16
+ if (s1 .charAt (idx ) == s2 .charAt (idx )) {
17
+ ret = solve (idx +1 , s1 ,s2 , dp );
18
+ } else {
19
+ for (int i =idx +1 ;i <s2 .length ();i ++) {
20
+ if (s2 .charAt (idx ) == s1 .charAt (i ) && s2 .charAt (i ) != s1 .charAt (i )) {
21
+ swap (idx , i , s1 );
22
+ int curr = 1 +solve (idx +1 , s1 ,s2 , dp );
23
+ swap (idx , i , s1 );
24
+ ret = Math .min (ret , curr );
25
+ }
26
+ }
27
+ }
28
+ if (ret == Integer .MAX_VALUE ) ret = 0 ;
29
+ dp .put (s1 .toString (), ret );
30
+ return ret ;
31
+ }
32
+
33
+ private void swap (int i , int j , StringBuilder sb ) {
34
+ char tmp = sb .charAt (i );
35
+ sb .replace (i , i +1 , sb .charAt (j )+"" );
36
+ sb .replace (j , j +1 , tmp +"" );
37
+ }
38
+
39
+ }
0 commit comments