栈
1.思路:在栈中只要把 / 的下标进栈和出栈就可以计算字符串中的字母,获取字符串中的字母用substring()函数根据 两个 / 的下标来确定区间。之后把符合的字母加入集合中。之后要判断值为“. ."时要删除集合中最后一个元素。之后用for循环拼接简化路径。
class Solution {
public String simplifyPath(String path) {
//将输入值最后加入一个/,防止输入值最后没有/进行数据截取。
path+="/";
String s1="";
//接收简要路径的集合
ArrayList<String> li=new ArrayList<>();
//栈来进行/的进栈操作来判断字符串中的规范字母值
Stack<Integer> st=new Stack <>();
//先进栈开头的/
st.push(0);
for(int i=1;i<path.length();i++){
//判断字符为‘/‘时要把开头的下标出栈,在将当前的/的下标进行进栈操作
if(path.charAt(i)=='/'){
int j=st.pop();
st.push(i);
//判断两个/中是否有字母
if(i-j>1){
//用substring来进行截取字符串
String d=path.substring(j+1,i);
//用于判断三个.和三个以上的.的路径
String o=path.substring(j+1,j+3);
//如果截取的字符串为“..”。要把集合中最后一位的元素删除,如果集合没有元素就跳过
if(d.equals("..")){
if(li.isEmpty()){
continue;
}
li.removeLast();
continue;
//如果截取的元素为一个.或者为三个.以上时跳过就好了
}else if(d.equals(".")||(o.equals(".")&&i-j>3)){
continue;
//截取的部分为字母时就添加到集合中
}else{
li.add(d);
}
}
}
}
//遍历集合拼接简化的路径
for(int i=0;i<li.size();i++){
s1+="/"+li.get(i);
}
//特殊情况,当集合中没有元素要进行特殊的处理。
if(li.size()==0){
s1="/";
}
return s1;
}
}