#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;
}
leetcode71简化路径 - 状态机
最新推荐文章于 2022-10-10 14:38:55 发布