最小操作数 (错误笔记)

最少操作次数的简易版

题目详情

给定两个字符串,仅由小写字母组成,它们包含了相同字符。

求把第一个字符串变成第二个字符串的最小操作次数,

且每次操作只能对第一个字符串中的某个字符移动到此字符串中的开头。

例如给定两个字符串“abcd" "bcad" ,输出:2,

因为需要操作2次才能把"abcd"变成“bcad" ,方法是:abcd->cabd->bcad。


(以下思路感谢http://www.360doc.com/content/13/1219/09/10504424_338332083.shtml  及作者、)

提前说明一下:以下代码   考虑不完全  所以会有bug    

不要盲目相信  、、在此  只是想做个个人笔记、、

思路:将第二个字符串变成数组   并且给每个字符下面加一个  int  数,

记着  第二个字符数组的数 是从0开始逐个递增的   、

将第一个字符串也转换成字符数组   同第二个一样 增加一个 对应的  int 数组   

只不过这个int 数组的元素是按照  第二个数组对应的字符的int数  来赋值的  

例如: 第二个数组 字符:a b c  对应的int 型数字: 0 1 2 

第一个数组: c  b  a     对应的int 型数字 : 2  1  0

只需 将第一个字符数组的  int数组   排序即可    应用逆序数、、、每次找逆序数中最大的数

=============================================================

后来在oucyxc(灰常感谢)的帮助下  发现 这段代码有bug   即:不能正常排序有重复字符

例:String a=“xykkr”   String  b=“rykxk”   输出的结果是 2 、、明显不对、、

代码:

class Node {
    private char ch;
    private int x;

    public Node(char c, int x1) {
        ch = c;
        x = x1;
    }

    public Node(char c){
        ch = c;
    }
    public char getCh() {
        return ch;
    }

    public void setCh(char ch) {
        this.ch = ch;
    }

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }
    }
public class Test 
{ 
    static int [] cc=null;
    static int z=0;


   public static  int getNumber(String a,String b)
    {
	   z=0;
        char[] arr=b.toCharArray();
       
        Node[] aa=new Node[arr.length];
        
        for(int i=0;i<arr.length;i++){
            
            Node temp = new Node(arr[i],i);
            aa[i] = temp;
            
            
            
        }
        char[] qq=a.toCharArray();
        Node[] bb=new Node [qq.length];
        for(int i=0;i<qq.length;i++){
            
            Node temp = new Node(qq[i]);
            bb[i] = temp;
            
            
        }
        for(int x=0;x<arr.length;x++){
            for(int z=0;z<qq.length;z++){
                if(aa[x].getCh()==bb[z].getCh()){
                    bb[z].setX(aa[x].getX());
                }
            }
            
            
        }
       
         cc=new int[bb.length];        
        for(int i=0;i<bb.length;i++){
            cc[i]=bb[i].getX();
        }
        jk_sort(cc);
        //System.out.println(z);
        return z;
    }
  
   
         public static int[] jk_remove(int[] s, int index) {
                int temp = s[index];
               for (int i = index - 1; i >= 0; i--) {
                     s[i + 1] = s[i];
                }
                s[0] = temp;
                z++;
                return s;
             }
       
         public static void jk_sort(int[] s) {
            int temp ='\0';  
            int p=0;
            
             for(int i = 1; i < s.length; i++) {
                for(int j = 0; j < i; j++) {
                 
                    if(s[i] < s[j]) {
                      
                        if(temp == '\0' || p < s[i]) {
                            p=s[i];
                             temp = i;
                         } 
                      
                       break;
                    }
           }
           


            }

           
                 if(temp != '\0') {
                     int [] arr=  jk_remove(s, temp);
                   
                   
                      jk_sort( arr);
                  }
                 else{
                    
                 }
         }
      
    public static void main(String args[]) 
    { 
      // System.out.println(getNumber("uyyrk","ukyry"));
      System.out.println(getNumber("xykkr","rykxk"));
    } 
    
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值