两个相等长度字符串都由数字组成,每次只能进行交换操作或加一操作或减一操作,求出使两个字符串相等的最少操作数。
思路:
1.两两判断交换之后操作少,还是不交换操作少。(不交换操作数为:对应数字差值的绝对值之和,交换的操作数为:交换之后对应数字差值的绝对值之和+1)
2.如果交换可以减少操作数,把交换后的操作数与其它交换后的操作数比较,找到最小值,进行交换
3.继续1步骤,直到不能交换为止
4.算出交换操作和加减操作之和 打印
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Main { public static void main(String[] args) throws IOException { BufferedReader bf=new BufferedReader(new InputStreamReader(System.in)); String arr[]=bf.readLine().split(" "); int length=arr[0].length(); int []number1=new int[length]; int []number2=new int[length]; for(int i=0;i<length;i++){ number1[i]=Integer.parseInt(arr[0].substring(i,i+1)); number2[i]=Integer.parseInt(arr[1].substring(i,i+1)); } boolean flag; int count=0; while(true){ flag=false; int a=-1; int b=-1; int min=Integer.MAX_VALUE; for(int i=0;i<length;i++){ for(int j=0;j<length;j++){ int temp1=Math.abs(number1[i]-number2[i]); int temp2=Math.abs(number1[j]-number2[j]); int temp3=Math.abs(number1[i]-number2[j]); int temp4=Math.abs(number1[j]-number2[i]); if(temp1+temp2>temp3+temp4+1){ if(min>temp3+temp4+1){ min=temp3+temp4+1; a=i; b=j; flag=true; } } } } if(flag==true){ int temp=number1[a]; number1[a]=number1[b]; number1[b]=temp; count++; }else{ break; } } for(int i=0;i<length;i++){ count +=Math.abs(number1[i]-number2[i]); } System.out.println(count); } }