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