LeetCode第71题:简化路径(中等)
- 题目:以 Unix 风格给出一个文件的绝对路径,你需要简化它。或者换句话说,将其转换为规范路径。在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (…) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。更多信息请参阅:Linux / Unix中的绝对路径 vs 相对路径。请注意,返回的规范路径必须始终以斜杠 / 开头,并且两个目录名之间必须只有一个斜杠 /。最后一个目录名(如果存在)不能以 / 结尾。此外,规范路径必须是表示绝对路径的最短字符串。
- 思路一:想到了第65题有效数字的问题,为了练习练习那道题的方法,我选择了状态集的办法。让我想不到的是,目录名竟然还可以包含点(黑人问号脸???),这个点什么时候可以留下,什么时候不能有,研究了半天。。。。终于在我快累死的时候过了。。。。
class Solution {
public int make(char c){
switch(c){
case '.' :return 0;
case '/' :return 1;
default:
return 2;
}
}
public String simplifyPath(String path) {
String res = "";
char[] ans = new char[path.length()];
ans[0]='/';
int state = 0;
int j = 1;
int[][] transfer = new int[][]{{ 1, 0, 2},
{ 3, 0, 2},
{ 1, 0, 2},
{ 2, 0, 2}};
char[] ss = path.toCharArray();
for(int i=1;i<ss.length;i++){
int id = make(ss[i]);
int stateNew=transfer[state][id];
if(state==0){
if(id==0){
ans[j++]='.';
}else if(id==2){
ans[j++]=ss[i];
}
}else if(state==1){
if(id==0){
ans[j++]='.';
}else if(id==1){
if(ans[j-2]=='/'){
j=j-1;
}else if(i!=ss.length-1){
ans[j++]='/';
}
}else if(id==2){
ans[j++]=ss[i];
}
}else if(state==2){
if(id==0){
ans[j++]='.';
}else if(id==1 && i!=ss.length-1){
ans[j++]='/';
}else if(id==2){
ans[j++]=ss[i];
}
}else if(state==3){
if(id==0){
ans[j++]='.';
}else if(id==1){
if(j>4){
j=j-4;
while(j>0 && ans[j] != '/'){
j--;
}
j++;
}else{
j=1;
}
}else if(id==2){
ans[j++]=ss[i];
}
}
state=stateNew;
}
if(state==3){
if(j>4){
j=j-4;
while(j>1 && ans[j] != '/'){
j--;
}
}else{
j=1;
}
}else if(state==1){
j=j-1;
}
if(j>1 && ans[j-1]=='/') j--;
for(int k=0;k<j;k++){
res+=ans[k];
}
return res;
}
}
- 思路二:题解里给的都是栈的方法,害,我也不会。下次遇到相似的题我再用用栈的方法吧。。。。
public String simplifyPath(String path) {
String[] s = path.split("/");
Stack<String> stack = new Stack<>();
for (int i = 0; i < s.length; i++) {
if (!stack.isEmpty() && s[i].equals(".."))
stack.pop();
else if (!s[i].equals("") && !s[i].equals(".") && !s[i].equals(".."))
stack.push(s[i]);
}
if (stack.isEmpty())
return "/";
StringBuffer res = new StringBuffer();
for (int i = 0; i < stack.size(); i++) {
res.append("/" + stack.get(i));
}
return res.toString();
}
作者:StackOverflow-
链接:https://leetcode-cn.com/problems/simplify-path/solution/java-yi-dong-yi-jie-xiao-lu-gao-by-spirit-9-18/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。