classSolution{
Map<Character,List<Integer>> mp;int[][] dp;publicintfindRotateSteps(String ring, String key){int rl=ring.length();int kl=key.length();if(kl==0)return0;char[] r=ring.toCharArray();char[] k=key.toCharArray();
mp =newHashMap<>();for(int i=0;i<rl;i++){//保存字符出现的位置if(mp.containsKey(r[i])){
mp.get(r[i]).add(i);}else{
List<Integer> next=newArrayList<>();
next.add(i);
mp.put(r[i],next);}}
dp =newint[kl][rl];
List<Integer> next2 = mp.get(k[0]);
Iterator<Integer> it2 = next2.iterator();while(it2.hasNext()){int c = it2.next();int m = Math.min(c,rl-c);//找到每个位置
dp[0][c]=m+1;}for(int i=1;i<kl;i++){
List<Integer> next = mp.get(k[i]);
Iterator<Integer> it = next.iterator();while(it.hasNext()){int c = it.next();//找到本次的所有位置int min=Integer.MAX_VALUE;
List<Integer> next1 = mp.get(k[i-1]);
Iterator<Integer> it1 = next1.iterator();while(it1.hasNext()){int d = it1.next();//找到上个字符所有的位置来计算//计算上一个k[i-1]到k[i]的最短距离int n = Math.abs(c-d);int m = Math.min(rl-n,n);
min=Math.min(min,dp[i-1][d]+m+1);}
dp[i][c]=min;}}int ans=Integer.MAX_VALUE;
List<Integer> next = mp.get(k[kl-1]);
Iterator<Integer> it = next.iterator();while(it.hasNext()){
ans=Math.min(ans,dp[kl-1][it.next()]);}return ans;}}
一种比较好理解的代码格式,思路相同。
classSolution{publicintfindRotateSteps(String ring, String key){int n = ring.length(), m = key.length();
List<Integer>[] pos =newList[26];for(int i =0; i <26;++i){
pos[i]=newArrayList<Integer>();}for(int i =0; i < n;++i){
pos[ring.charAt(i)-'a'].add(i);}int[][] dp =newint[m][n];for(int i =0; i < m;++i){
Arrays.fill(dp[i],0x3f3f3f);}for(int i : pos[key.charAt(0)-'a']){
dp[0][i]= Math.min(i, n - i)+1;}for(int i =1; i < m;++i){for(int j : pos[key.charAt(i)-'a']){for(int k : pos[key.charAt(i -1)-'a']){
dp[i][j]= Math.min(dp[i][j], dp[i -1][k]+ Math.min(Math.abs(j - k), n - Math.abs(j - k))+1);}}}return Arrays.stream(dp[m -1]).min().getAsInt();}}