leetcode71简化路径 - 状态机

#include "string.h"
#include "stdio.h"

typedef enum {
    STATE_INIT,      // 刚刚处理完成
    STATE_ONE_POINT, // 只读到了1个'.'
    STATE_TWO_POINT, // 只读到了2个'.'
    STATE_PATH,      // 读到一个正常路径
} State;

State stateInitProc(char *path, int read, int *anchor, int *write)
{
    char c = path[read];
    switch (c) {
        // 连续两个'/' anchor后移
        case '/':
            *anchor = read + 1;
            return STATE_INIT;
        // 读到.进入ONE POINT态
        case '.':
            return STATE_ONE_POINT;
        // 其他情况进入PATH态
        default:
            return STATE_PATH;
    }
    return STATE_INIT;
}
State stateOneProc(char *path, int read, int *anchor, int *write)
{
    char c = path[read];
    switch (c) {
        // '/./' anchor后移
        case '/':
            *anchor = read + 1;
            return STATE_INIT;
        // 读到.进入TWO POINT态
        case '.':
            return STATE_TWO_POINT;
        // 其他情况进入PATH态
        default:
            return STATE_PATH;
    }
    return STATE_INIT;
}
State stateTwoProc(char *path, int read, int *anchor, int *write)
{
    char c = path[read];
    switch (c) {
        // '/../' anchor后移 write前移
        case '/':
            if (*write > 1) {
              // 先将上一个/退出
              do {
                  (*write)--;
                  c = path[(*write) - 1];
                  if ((*write) == 1 || c == '/') {
                      break;
                  }
              } while (true);
            }
            *anchor = read + 1;
            return STATE_INIT;
        // 其他情况进入PATH态
        default:
            return STATE_PATH;
    }
    return STATE_INIT;
}
State statePathProc(char *path, int read, int *anchor, int *write)
{
    char c = path[read];
    switch (c) {
        // '/blabla/' anchor后移 写入数据
        case '/':
            while (*anchor <= read) {
                path[(*write)] = path[(*anchor)];
                (*write)++;
                (*anchor)++;
            }
            return STATE_INIT;
        // 其他情况进入PATH态
        default:
            return STATE_PATH;
    }
    return STATE_INIT;
}

char *simplifyPath(char *path)
{
    int len = strlen(path);
    if (len == 1) {
        return path;
    }
    // 补一个结束符
    path[len] = '/';
    int read;
    int write = 1;
    int anchor = 1;
    State state = STATE_INIT;
    for (read = 1; read < len + 1; read++) {
        switch (state) {
            case STATE_INIT:
                state = stateInitProc(path, read, &anchor, &write);
                break;
            case STATE_ONE_POINT:
                state = stateOneProc(path, read, &anchor, &write);
                break;
            case STATE_TWO_POINT:
                state = stateTwoProc(path, read, &anchor, &write);
                break;
            case STATE_PATH:
                state = statePathProc(path, read, &anchor, &write);
                break;
        }
    }
    if (write > 1 && path[write - 1] == '/') {
        path[write - 1] = '\0';
    } else {
        path[write] = '\0';
    }
    return path;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

自由技艺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值