【leetcode】自由之路

typedef struct st{
    int pst;
    int* arr;
}st;
#define min(a,b) (a)<(b)?(a):(b)

int findRotateSteps(char * ring, char * key){
    int i,j,k,minStep=100000,val;
    int keylen=strlen(key), ringlen=strlen(ring);
    st ans[128]={0};
    int* step=(int*)calloc(ringlen,sizeof(int));
    for (i=0; i<ringlen; i++)
    {
        if (strchr(key,ring[i]))
        {
            if (ans[ring[i]].pst == 0)
                ans[ring[i]].arr=(int*)calloc(ringlen,sizeof(int));
            ans[ring[i]].arr[(ans[ring[i]].pst)++]=i;
        }
    }
    for (i=keylen-2; i>=0; i--)
    {
        int* temp=(int*)calloc(ans[key[i]].pst,sizeof(int));
        memset(temp,0x7f, ans[key[i]].pst*sizeof(int));
        for (j=0; j<ans[key[i]].pst; j++)
        {
            for (k=0; k<ans[key[i+1]].pst; k++)
            {
                val=min(abs(ans[key[i+1]].arr[k] - ans[key[i]].arr[j]),ringlen-abs(ans[key[i+1]].arr[k] - ans[key[i]].arr[j]));
                if (val+step[k] < temp[j])
                    temp[j]=val+step[k];
            }
        }
        step=temp;
    }
    for (k=0; k<ans[key[0]].pst; k++)
    {
        val=min(ans[key[0]].arr[k],ringlen-ans[key[0]].arr[k]);
        if (val+step[k] < minStep)
            minStep=val+step[k];
    }
    return minStep+keylen;
}

 

posted @ 2020-11-11 20:47  温暖了寂寞  阅读(131)  评论(0编辑  收藏  举报