leetcode 剑指 Offer 20. 表示数值的字符串 514. 自由之路

剑指 Offer 20. 表示数值的字符串

想起来这题可以用有限状态机来写,不懂,日后填坑,大概。

bool isNumber(char* s){
     
    int start = 0;
    int end = strlen(s);
    for(int i=0;i<strlen(s);i++){
     
        if(s[i]!=' ')break;
        start+=1;
    }
    for(int i=strlen(s)-1;i>=0;i--){
     
        if(s[i]!=' ')break;
        end-=1;
    }
    int Epos = end;
    for(int i=start;i<end;i++){
     
        if(s[i]=='E'||s[i]=='e'){
     
            Epos = i;
            break;
        }
    }
    int i=start;
    if(s[i]=='+'||s[i]=='-') i+=1;
    bool num = false;
    bool dot = false;
    for(;i<Epos;i++){
     
        if(s[i]>='0'&&s[i]<='9') num=true;
        else if(s[i]=='.') {
     
            if(dot) return false;
            else dot=true;
        }
        else return false;
    }
    if(!num) return false;
    else num=false;

    i=Epos+1;
    if(i<end&&(s[i]=='+'||s[i]=='-')) i+=1;
    for(;i<end;i++){
     
        if(s[i]<'0'||s[i]>'9') return false;
        else num=true;
    }
    if(Epos != end&&!num) return false;
    return true;
}


514. 自由之路

真巧妙啊,草踏马的,比我写的快了四十倍。踏马。

int findRotateSteps(char* ring, char* key) {
     
    int n = strlen(ring), m = strlen(key);
    int pos[26][n], posSize[26];
    memset(posSize, 0, sizeof(posSize));
    for (int i = 0; i < n; ++i) {
     
        int x = ring[i] - 'a';
        pos[x][posSize[x]++] = i;
    }
    int dp[m][n];
    memset(dp, 0x3f3f3f3f, sizeof(dp));
    for (int i = 0; i < posSize[key[0] - 'a']; i++) {
     
        int x = pos[key[0] - 'a'][i];
        dp[0][x] = fmin(x, n - x) + 1;
    }
    for (int i = 1; i < m; ++i) {
     
        for (int j = 0; j < posSize[key[i] - 'a']; ++j) {
     
            int x = pos[key[i] - 'a'][j];
            for (int k = 0; k < posSize[key[i - 1] - 'a']; ++k) {
     
                int y = pos[key[i - 1] - 'a'][k];
                dp[i][x] = fmin(dp[i][x], dp[i - 1][y] + fmin(abs(x - y), n - abs(x - y)) + 1);
            }
        }
    }
    int ret = dp[m - 1][0];
    for (int i = 1; i < n; ++i) {
     
        ret = fmin(ret, dp[m - 1][i]);
    }
    return ret;
}

你可能感兴趣的:(leetcode,more)